Antony Reynolds

Subscribe to Antony Reynolds feed
Oracle Blogs
Updated: 1 hour 5 min ago

Building an FMW Cluster using Docker (Part III Running Docker Containers)

Mon, 2017-03-13 01:02

Click here for a Google Docs version of this document that doesn't suffer from the Oracle blog formatting problems

@import

url('https://themes.googleusercontent.com/fonts/css?kit=soJ-z33zIWP9ip4SlSLqmawpPKmPqgwAG3potzd-b6hLxa5kJlTvGyssufwSrkOWWWXuzMD-CMEVHDC2H45HXw')

;.lst-kix_sholqrhc62dh-7>li:before {

content: "\0025cb "}.lst-kix_sholqrhc62dh-8>li:before {

content: "\0025a0 "}.lst-kix_sholqrhc62dh-6>li:before {

content: "\0025cf "}ol.lst-kix_vf0l197cqv6l-2.start {

counter-reset: lst-ctn-kix_vf0l197cqv6l-2 0}ol.lst-kix_xv318blpjdo-3.start {

counter-reset: lst-ctn-kix_xv318blpjdo-3 0}.lst-kix_sholqrhc62dh-1>li:before {

content: "\0025cb "}.lst-kix_vf0l197cqv6l-2>li:before {

content: "" counter(lst-ctn-kix_vf0l197cqv6l-2, lower-roman) ". "}.lst-kix_sholqrhc62dh-0>li:before {

content: "\0025cf "}.lst-kix_emhp84jkv42c-3>li {

counter-increment: lst-ctn-kix_emhp84jkv42c-3}.lst-kix_ekmayt81kvbz-0>li:before {

content: "\0025cf "}.lst-kix_vf0l197cqv6l-1>li:before {

content: "\0025cb "}.lst-kix_jj5w63toozfm-4>li {

counter-increment: lst-ctn-kix_jj5w63toozfm-4}.lst-kix_ekmayt81kvbz-2>li:before {

content: "\0025a0 "}ul.lst-kix_qeqyxe7gm97l-6 {

list-style-type: none}ul.lst-kix_qeqyxe7gm97l-5 {

list-style-type: none}.lst-kix_ekmayt81kvbz-1>li:before {

content: "\0025cb "}ul.lst-kix_qeqyxe7gm97l-4 {

list-style-type: none}.lst-kix_ekmayt81kvbz-3>li:before {

content: "\0025cf "}ul.lst-kix_qeqyxe7gm97l-3 {

list-style-type: none}.lst-kix_vf0l197cqv6l-0>li:before {

content: "" counter(lst-ctn-kix_vf0l197cqv6l-0, decimal) ". "}ul.lst-kix_qeqyxe7gm97l-2 {

list-style-type: none}ul.lst-kix_qeqyxe7gm97l-1 {

list-style-type: none}ul.lst-kix_qeqyxe7gm97l-0 {

list-style-type: none}ol.lst-kix_11a9ub9xa97v-8.start {

counter-reset: lst-ctn-kix_11a9ub9xa97v-8 0}.lst-kix_ekmayt81kvbz-5>li:before {

content: "\0025a0 "}.lst-kix_ekmayt81kvbz-7>li:before {

content: "\0025cb "}ul.lst-kix_4m04az9jmmj8-3 {

list-style-type: none}ul.lst-kix_4m04az9jmmj8-2 {

list-style-type: none}ul.lst-kix_qeqyxe7gm97l-8 {

list-style-type: none}ul.lst-kix_4m04az9jmmj8-1 {

list-style-type: none}.lst-kix_ekmayt81kvbz-4>li:before {

content: "\0025cb "}.lst-kix_ekmayt81kvbz-8>li:before {

content: "\0025a0 "}ul.lst-kix_qeqyxe7gm97l-7 {

list-style-type: none}ul.lst-kix_4m04az9jmmj8-0 {

list-style-type: none}ul.lst-kix_4m04az9jmmj8-7 {

list-style-type: none}ul.lst-kix_4m04az9jmmj8-6 {

list-style-type: none}ul.lst-kix_4m04az9jmmj8-5 {

list-style-type: none}ul.lst-kix_4m04az9jmmj8-4 {

list-style-type: none}.lst-kix_ekmayt81kvbz-6>li:before {

content: "\0025cf "}ul.lst-kix_4m04az9jmmj8-8 {

list-style-type: none}.lst-kix_s3mi7ukxwiwf-2>li {

counter-increment: lst-ctn-kix_s3mi7ukxwiwf-2}.lst-kix_11a9ub9xa97v-0>li {

counter-increment: lst-ctn-kix_11a9ub9xa97v-0}ol.lst-kix_emhp84jkv42c-4.start {

counter-reset: lst-ctn-kix_emhp84jkv42c-4 0}ol.lst-kix_xv318blpjdo-8.start {

counter-reset: lst-ctn-kix_xv318blpjdo-8 0}ul.lst-kix_6ril5iwt0fcl-5 {

list-style-type: none}.lst-kix_q8ok0mh9yyto-8>li {

counter-increment: lst-ctn-kix_q8ok0mh9yyto-8}ul.lst-kix_6ril5iwt0fcl-4 {

list-style-type: none}ul.lst-kix_6ril5iwt0fcl-3 {

list-style-type: none}ul.lst-kix_6ril5iwt0fcl-2 {

list-style-type: none}ul.lst-kix_6ril5iwt0fcl-8 {

list-style-type: none}ul.lst-kix_6ril5iwt0fcl-7 {

list-style-type: none}ul.lst-kix_6ril5iwt0fcl-6 {

list-style-type: none}.lst-kix_vf0l197cqv6l-6>li {

counter-increment: lst-ctn-kix_vf0l197cqv6l-6}.lst-kix_vf0l197cqv6l-4>li:before {

content: "" counter(lst-ctn-kix_vf0l197cqv6l-4, lower-latin) ". "}ol.lst-kix_s3mi7ukxwiwf-8.start {

counter-reset: lst-ctn-kix_s3mi7ukxwiwf-8 0}.lst-kix_vf0l197cqv6l-3>li:before {

content: "" counter(lst-ctn-kix_vf0l197cqv6l-3, decimal) ". "}.lst-kix_vf0l197cqv6l-5>li:before {

content: "" counter(lst-ctn-kix_vf0l197cqv6l-5, lower-roman) ". "}.lst-kix_vf0l197cqv6l-6>li:before {

content: "" counter(lst-ctn-kix_vf0l197cqv6l-6, decimal) ". "}ul.lst-kix_6ril5iwt0fcl-1 {

list-style-type: none}.lst-kix_vf0l197cqv6l-8>li:before {

content: "" counter(lst-ctn-kix_vf0l197cqv6l-8, lower-roman) ". "}ul.lst-kix_6ril5iwt0fcl-0 {

list-style-type: none}.lst-kix_xv318blpjdo-1>li {

counter-increment: lst-ctn-kix_xv318blpjdo-1}.lst-kix_vf0l197cqv6l-7>li:before {

content: "" counter(lst-ctn-kix_vf0l197cqv6l-7, lower-latin) ". "}.lst-kix_bfzyeb917dp8-6>li {

counter-increment: lst-ctn-kix_bfzyeb917dp8-6}ol.lst-kix_yly1729bcywk-0 {

list-style-type: none}ol.lst-kix_yly1729bcywk-1 {

list-style-type: none}ol.lst-kix_yly1729bcywk-6.start {

counter-reset: lst-ctn-kix_yly1729bcywk-6 0}ol.lst-kix_yly1729bcywk-4 {

list-style-type: none}ol.lst-kix_yly1729bcywk-5 {

list-style-type: none}ol.lst-kix_yly1729bcywk-2 {

list-style-type: none}ol.lst-kix_yly1729bcywk-3 {

list-style-type: none}.lst-kix_s3mi7ukxwiwf-1>li:before {

content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-1, lower-latin) ". "}ol.lst-kix_yly1729bcywk-8 {

list-style-type: none}ul.lst-kix_hchtl271h88l-3 {

list-style-type: none}ol.lst-kix_ne7nl4nhpzqr-0.start {

counter-reset: lst-ctn-kix_ne7nl4nhpzqr-0 0}ul.lst-kix_hchtl271h88l-2 {

list-style-type: none}ol.lst-kix_yly1729bcywk-6 {

list-style-type: none}ul.lst-kix_hchtl271h88l-5 {

list-style-type: none}ol.lst-kix_yly1729bcywk-7 {

list-style-type: none}ul.lst-kix_hchtl271h88l-4 {

list-style-type: none}.lst-kix_gfromclascha-0>li:before {

content: "\0025cf "}ul.lst-kix_hchtl271h88l-1 {

list-style-type: none}ul.lst-kix_hchtl271h88l-0 {

list-style-type: none}.lst-kix_gfromclascha-2>li:before {

content: "\0025a0 "}.lst-kix_gfromclascha-4>li:before {

content: "\0025cb "}ul.lst-kix_hchtl271h88l-7 {

list-style-type: none}ul.lst-kix_hchtl271h88l-6 {

list-style-type: none}ul.lst-kix_hchtl271h88l-8 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-7.start {

counter-reset: lst-ctn-kix_bfzyeb917dp8-7 0}.lst-kix_6ril5iwt0fcl-0>li:before {

content: "\0025cf "}.lst-kix_gfromclascha-6>li:before {

content: "\0025cf "}.lst-kix_q97rvvc7c69e-5>li:before {

content: "\0025a0 "}.lst-kix_q97rvvc7c69e-7>li:before {

content: "\0025cb "}ol.lst-kix_q8ok0mh9yyto-8.start {

counter-reset: lst-ctn-kix_q8ok0mh9yyto-8 0}.lst-kix_6ril5iwt0fcl-2>li:before {

content: "\0025a0 "}.lst-kix_q97rvvc7c69e-3>li:before {

content: "\0025cf "}.lst-kix_s3mi7ukxwiwf-7>li:before {

content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-7, lower-latin) ". "}.lst-kix_6ril5iwt0fcl-4>li:before {

content: "\0025cb "}.lst-kix_6ril5iwt0fcl-6>li:before {

content: "\0025cf "}.lst-kix_xv318blpjdo-8>li {

counter-increment: lst-ctn-kix_xv318blpjdo-8}.lst-kix_s3mi7ukxwiwf-5>li:before {

content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-5, lower-roman) ". "}.lst-kix_6ril5iwt0fcl-8>li:before {

content: "\0025a0 "}.lst-kix_s3mi7ukxwiwf-3>li:before {

content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-3, decimal) ". "}.lst-kix_ne7nl4nhpzqr-0>li {

counter-increment: lst-ctn-kix_ne7nl4nhpzqr-0}.lst-kix_ne7nl4nhpzqr-7>li {

counter-increment: lst-ctn-kix_ne7nl4nhpzqr-7}.lst-kix_vf0l197cqv6l-5>li {

counter-increment: lst-ctn-kix_vf0l197cqv6l-5}ol.lst-kix_jj5w63toozfm-7.start {

counter-reset: lst-ctn-kix_jj5w63toozfm-7 0}.lst-kix_1wulu3ra2vwv-4>li:before {

content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-4, decimal) ") "}.lst-kix_yly1729bcywk-3>li {

counter-increment: lst-ctn-kix_yly1729bcywk-3}.lst-kix_hchtl271h88l-5>li:before {

content: "\0025a0 "}.lst-kix_1wulu3ra2vwv-6>li:before {

content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-6, lower-roman) ") "}.lst-kix_yly1729bcywk-4>li {

counter-increment: lst-ctn-kix_yly1729bcywk-4}.lst-kix_hchtl271h88l-7>li:before {

content: "\0025cb "}.lst-kix_1wulu3ra2vwv-8>li:before {

content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-8, lower-roman) ") "}.lst-kix_gfromclascha-8>li:before {

content: "\0025a0 "}.lst-kix_hchtl271h88l-3>li:before {

content: "\0025cf "}.lst-kix_sholqrhc62dh-2>li:before {

content: "\0025a0 "}ul.lst-kix_9jxnjym0nges-0 {

list-style-type: none}.lst-kix_hchtl271h88l-1>li:before {

content: "\0025cb "}.lst-kix_sholqrhc62dh-4>li:before {

content: "\0025cb "}.lst-kix_1wulu3ra2vwv-2>li:before {

content: "" counter(lst-ctn-kix_1wulu3ra2vwv-2, decimal) ". "}.lst-kix_1wulu3ra2vwv-0>li:before {

content: "" counter(lst-ctn-kix_1wulu3ra2vwv-0, upper-roman) ". "}ol.lst-kix_11a9ub9xa97v-3.start {

counter-reset: lst-ctn-kix_11a9ub9xa97v-3 0}.lst-kix_emhp84jkv42c-2>li {

counter-increment: lst-ctn-kix_emhp84jkv42c-2}ol.lst-kix_s3mi7ukxwiwf-4.start {

counter-reset: lst-ctn-kix_s3mi7ukxwiwf-4 0}ul.lst-kix_h0kibz3smj6t-8 {

list-style-type: none}ol.lst-kix_1wulu3ra2vwv-7.start {

counter-reset: lst-ctn-kix_1wulu3ra2vwv-7 0}.lst-kix_jkgkf1u9sy0c-2>li:before {

content: "\0025a0 "}.lst-kix_f5kb4hocu5hh-2>li:before {

content: "\0025a0 "}.lst-kix_jkgkf1u9sy0c-1>li:before {

content: "\0025cb "}.lst-kix_f5kb4hocu5hh-6>li:before {

content: "\0025cf "}ul.lst-kix_iv2x96orjh4l-2 {

list-style-type: none}ol.lst-kix_ne7nl4nhpzqr-1.start {

counter-reset: lst-ctn-kix_ne7nl4nhpzqr-1 0}ul.lst-kix_iv2x96orjh4l-3 {

list-style-type: none}.lst-kix_f5kb4hocu5hh-5>li:before {

content: "\0025a0 "}ul.lst-kix_iv2x96orjh4l-0 {

list-style-type: none}.lst-kix_jj5w63toozfm-3>li {

counter-increment: lst-ctn-kix_jj5w63toozfm-3}ul.lst-kix_iv2x96orjh4l-1 {

list-style-type: none}ul.lst-kix_iv2x96orjh4l-6 {

list-style-type: none}ul.lst-kix_iv2x96orjh4l-7 {

list-style-type: none}.lst-kix_ne7nl4nhpzqr-6>li {

counter-increment: lst-ctn-kix_ne7nl4nhpzqr-6}ul.lst-kix_iv2x96orjh4l-4 {

list-style-type: none}ul.lst-kix_iv2x96orjh4l-5 {

list-style-type: none}ul.lst-kix_h0kibz3smj6t-3 {

list-style-type: none}ul.lst-kix_h0kibz3smj6t-2 {

list-style-type: none}ul.lst-kix_h0kibz3smj6t-1 {

list-style-type: none}.lst-kix_jkgkf1u9sy0c-5>li:before {

content: "\0025a0 "}ul.lst-kix_h0kibz3smj6t-0 {

list-style-type: none}ol.lst-kix_jj5w63toozfm-2.start {

counter-reset: lst-ctn-kix_jj5w63toozfm-2 0}ul.lst-kix_h0kibz3smj6t-7 {

list-style-type: none}ul.lst-kix_h0kibz3smj6t-6 {

list-style-type: none}ul.lst-kix_h0kibz3smj6t-5 {

list-style-type: none}.lst-kix_jkgkf1u9sy0c-6>li:before {

content: "\0025cf "}ul.lst-kix_h0kibz3smj6t-4 {

list-style-type: none}.lst-kix_emhp84jkv42c-4>li {

counter-increment: lst-ctn-kix_emhp84jkv42c-4}ul.lst-kix_iv2x96orjh4l-8 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-3.start {

counter-reset: lst-ctn-kix_bfzyeb917dp8-3 0}.lst-kix_b7256qmdgo85-3>li:before {

content: "\0025cf "}.lst-kix_b7256qmdgo85-4>li:before {

content: "\0025cb "}.lst-kix_b7256qmdgo85-7>li:before {

content: "\0025cb "}ol.lst-kix_jj5w63toozfm-3.start {

counter-reset: lst-ctn-kix_jj5w63toozfm-3 0}.lst-kix_q97rvvc7c69e-2>li:before {

content: "\0025a0 "}.lst-kix_b7256qmdgo85-8>li:before {

content: "\0025a0 "}ol.lst-kix_bfzyeb917dp8-2.start {

counter-reset: lst-ctn-kix_bfzyeb917dp8-2 0}ol.lst-kix_1wulu3ra2vwv-6.start {

counter-reset: lst-ctn-kix_1wulu3ra2vwv-6 0}ol.lst-kix_yly1729bcywk-7.start {

counter-reset: lst-ctn-kix_yly1729bcywk-7 0}.lst-kix_jj5w63toozfm-5>li {

counter-increment: lst-ctn-kix_jj5w63toozfm-5}.lst-kix_s3mi7ukxwiwf-0>li:before {

content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-0, decimal) ". "}ul.lst-kix_q97rvvc7c69e-4 {

list-style-type: none}ul.lst-kix_q97rvvc7c69e-3 {

list-style-type: none}ul.lst-kix_q97rvvc7c69e-6 {

list-style-type: none}ol.lst-kix_vf0l197cqv6l-6.start {

counter-reset: lst-ctn-kix_vf0l197cqv6l-6 0}.lst-kix_s3mi7ukxwiwf-8>li:before {

content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-8, lower-roman) ". "}ul.lst-kix_q97rvvc7c69e-5 {

list-style-type: none}ul.lst-kix_q97rvvc7c69e-8 {

list-style-type: none}ul.lst-kix_q97rvvc7c69e-7 {

list-style-type: none}.lst-kix_gfromclascha-3>li:before {

content: "\0025cf "}ul.lst-kix_q97rvvc7c69e-0 {

list-style-type: none}ul.lst-kix_q97rvvc7c69e-2 {

list-style-type: none}ul.lst-kix_q97rvvc7c69e-1 {

list-style-type: none}.lst-kix_yly1729bcywk-3>li:before {

content: "" counter(lst-ctn-kix_yly1729bcywk-3, decimal) ". "}.lst-kix_q97rvvc7c69e-6>li:before {

content: "\0025cf "}.lst-kix_6ril5iwt0fcl-1>li:before {

content: "\0025cb "}.lst-kix_iv2x96orjh4l-6>li:before {

content: "\0025cf "}.lst-kix_yly1729bcywk-7>li:before {

content: "" counter(lst-ctn-kix_yly1729bcywk-7, lower-latin) ". "}ol.lst-kix_s3mi7ukxwiwf-3.start {

counter-reset: lst-ctn-kix_s3mi7ukxwiwf-3 0}.lst-kix_6ril5iwt0fcl-5>li:before {

content: "\0025a0 "}.lst-kix_iv2x96orjh4l-2>li:before {

content: "\0025a0 "}.lst-kix_q8ok0mh9yyto-1>li {

counter-increment: lst-ctn-kix_q8ok0mh9yyto-1}.lst-kix_s3mi7ukxwiwf-4>li:before {

content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-4, lower-latin) ". "}.lst-kix_5anu1k9tsyak-2>li:before {

content: "\0025a0 "}.lst-kix_b7256qmdgo85-0>li:before {

content: "\0025cf "}ul.lst-kix_vf0l197cqv6l-1 {

list-style-type: none}.lst-kix_1wulu3ra2vwv-3>li:before {

content: "" counter(lst-ctn-kix_1wulu3ra2vwv-3, lower-latin) ") "}.lst-kix_xoos54gyybzj-5>li:before {

content: "\0025a0 "}ol.lst-kix_ne7nl4nhpzqr-5.start {

counter-reset: lst-ctn-kix_ne7nl4nhpzqr-5 0}ol.lst-kix_vf0l197cqv6l-7.start {

counter-reset: lst-ctn-kix_vf0l197cqv6l-7 0}.lst-kix_11a9ub9xa97v-7>li {

counter-increment: lst-ctn-kix_11a9ub9xa97v-7}.lst-kix_1wulu3ra2vwv-7>li:before {

content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-7, lower-latin) ") "}.lst-kix_xoos54gyybzj-1>li:before {

content: "\0025cb "}ol.lst-kix_ne7nl4nhpzqr-2 {

list-style-type: none}ol.lst-kix_ne7nl4nhpzqr-3 {

list-style-type: none}ol.lst-kix_ne7nl4nhpzqr-0 {

list-style-type: none}ol.lst-kix_ne7nl4nhpzqr-1 {

list-style-type: none}ol.lst-kix_ne7nl4nhpzqr-6 {

list-style-type: none}.lst-kix_hchtl271h88l-8>li:before {

content: "\0025a0 "}ol.lst-kix_ne7nl4nhpzqr-7 {

list-style-type: none}ol.lst-kix_ne7nl4nhpzqr-4 {

list-style-type: none}ol.lst-kix_ne7nl4nhpzqr-5 {

list-style-type: none}ol.lst-kix_ne7nl4nhpzqr-8 {

list-style-type: none}.lst-kix_1wulu3ra2vwv-6>li {

counter-increment: lst-ctn-kix_1wulu3ra2vwv-6}.lst-kix_gfromclascha-7>li:before {

content: "\0025cb "}ol.lst-kix_ne7nl4nhpzqr-6.start {

counter-reset: lst-ctn-kix_ne7nl4nhpzqr-6 0}ul.lst-kix_pcjo479wrta-0 {

list-style-type: none}.lst-kix_86hsx13ssqid-5>li:before {

content: "\0025a0 "}ul.lst-kix_pcjo479wrta-2 {

list-style-type: none}ul.lst-kix_pcjo479wrta-1 {

list-style-type: none}ul.lst-kix_pcjo479wrta-4 {

list-style-type: none}.lst-kix_hchtl271h88l-4>li:before {

content: "\0025cb "}ul.lst-kix_pcjo479wrta-3 {

list-style-type: none}ul.lst-kix_pcjo479wrta-6 {

list-style-type: none}ul.lst-kix_pcjo479wrta-5 {

list-style-type: none}ul.lst-kix_pcjo479wrta-8 {

list-style-type: none}ul.lst-kix_pcjo479wrta-7 {

list-style-type: none}ol.lst-kix_vf0l197cqv6l-8.start {

counter-reset: lst-ctn-kix_vf0l197cqv6l-8 0}.lst-kix_hchtl271h88l-0>li:before {

content: "\0025cf "}.lst-kix_86hsx13ssqid-1>li:before {

content: "\0025cb "}.lst-kix_sholqrhc62dh-5>li:before {

content: "\0025a0 "}.lst-kix_7tib3jrzu2u9-0>li:before {

content: "\0025cf "}.lst-kix_7tib3jrzu2u9-5>li:before {

content: "\0025a0 "}.lst-kix_7tib3jrzu2u9-2>li:before {

content: "\0025a0 "}.lst-kix_7tib3jrzu2u9-3>li:before {

content: "\0025cf "}ul.lst-kix_ndaonzmgp8vn-4 {

list-style-type: none}ul.lst-kix_ndaonzmgp8vn-3 {

list-style-type: none}ul.lst-kix_ndaonzmgp8vn-6 {

list-style-type: none}ul.lst-kix_ndaonzmgp8vn-5 {

list-style-type: none}ul.lst-kix_ndaonzmgp8vn-0 {

list-style-type: none}ul.lst-kix_ndaonzmgp8vn-2 {

list-style-type: none}.lst-kix_bfzyeb917dp8-4>li {

counter-increment: lst-ctn-kix_bfzyeb917dp8-4}ul.lst-kix_ndaonzmgp8vn-1 {

list-style-type: none}.lst-kix_7tib3jrzu2u9-8>li:before {

content: "\0025a0 "}ul.lst-kix_sholqrhc62dh-6 {

list-style-type: none}ul.lst-kix_sholqrhc62dh-5 {

list-style-type: none}ul.lst-kix_sholqrhc62dh-4 {

list-style-type: none}ul.lst-kix_sholqrhc62dh-3 {

list-style-type: none}ul.lst-kix_sholqrhc62dh-8 {

list-style-type: none}ul.lst-kix_sholqrhc62dh-7 {

list-style-type: none}ul.lst-kix_sholqrhc62dh-2 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-6.start {

counter-reset: lst-ctn-kix_bfzyeb917dp8-6 0}ul.lst-kix_sholqrhc62dh-1 {

list-style-type: none}ul.lst-kix_sholqrhc62dh-0 {

list-style-type: none}.lst-kix_emhp84jkv42c-1>li {

counter-increment: lst-ctn-kix_emhp84jkv42c-1}ul.lst-kix_ndaonzmgp8vn-8 {

list-style-type: none}ul.lst-kix_ndaonzmgp8vn-7 {

list-style-type: none}.lst-kix_j42a5dwgnqyq-8>li:before {

content: "\0025a0 "}.lst-kix_5anu1k9tsyak-6>li:before {

content: "\0025cf "}ol.lst-kix_bfzyeb917dp8-1.start {

counter-reset: lst-ctn-kix_bfzyeb917dp8-1 0}.lst-kix_j42a5dwgnqyq-7>li:before {

content: "\0025cb "}.lst-kix_qeqyxe7gm97l-7>li:before {

content: "\0025cb "}.lst-kix_qeqyxe7gm97l-8>li:before {

content: "\0025a0 "}.lst-kix_5anu1k9tsyak-8>li:before {

content: "\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-2.start {

counter-reset: lst-ctn-kix_s3mi7ukxwiwf-2 0}.lst-kix_yly1729bcywk-5>li {

counter-increment: lst-ctn-kix_yly1729bcywk-5}ul.lst-kix_686a8e4qhxwx-4 {

list-style-type: none}ul.lst-kix_686a8e4qhxwx-3 {

list-style-type: none}ul.lst-kix_686a8e4qhxwx-2 {

list-style-type: none}ul.lst-kix_686a8e4qhxwx-1 {

list-style-type: none}ul.lst-kix_686a8e4qhxwx-8 {

list-style-type: none}ul.lst-kix_686a8e4qhxwx-7 {

list-style-type: none}ul.lst-kix_686a8e4qhxwx-6 {

list-style-type: none}.lst-kix_6qnkx7t1adn9-0>li:before {

content: "\0025cf "}.lst-kix_qeqyxe7gm97l-0>li:before {

content: "\0025cf "}ul.lst-kix_686a8e4qhxwx-5 {

list-style-type: none}.lst-kix_6qnkx7t1adn9-1>li:before {

content: "\0025cb "}.lst-kix_6qnkx7t1adn9-3>li:before {

content: "\0025cf "}ul.lst-kix_686a8e4qhxwx-0 {

list-style-type: none}.lst-kix_bfzyeb917dp8-0>li {

counter-increment: lst-ctn-kix_bfzyeb917dp8-0}.lst-kix_qeqyxe7gm97l-5>li:before {

content: "\0025a0 "}.lst-kix_j42a5dwgnqyq-0>li:before {

content: "\0025cf "}.lst-kix_j42a5dwgnqyq-2>li:before {

content: "\0025a0 "}.lst-kix_j42a5dwgnqyq-5>li:before {

content: "\0025a0 "}ol.lst-kix_emhp84jkv42c-3.start {

counter-reset: lst-ctn-kix_emhp84jkv42c-3 0}.lst-kix_qeqyxe7gm97l-2>li:before {

content: "\0025a0 "}.lst-kix_emhp84jkv42c-8>li {

counter-increment: lst-ctn-kix_emhp84jkv42c-8}ol.lst-kix_s3mi7ukxwiwf-0.start {

counter-reset: lst-ctn-kix_s3mi7ukxwiwf-0 0}.lst-kix_86hsx13ssqid-8>li:before {

content: "\0025a0 "}ol.lst-kix_vf0l197cqv6l-6 {

list-style-type: none}ul.lst-kix_xoos54gyybzj-4 {

list-style-type: none}ol.lst-kix_vf0l197cqv6l-7 {

list-style-type: none}ul.lst-kix_xoos54gyybzj-5 {

list-style-type: none}ol.lst-kix_vf0l197cqv6l-3.start {

counter-reset: lst-ctn-kix_vf0l197cqv6l-3 0}ol.lst-kix_vf0l197cqv6l-4 {

list-style-type: none}ul.lst-kix_xoos54gyybzj-6 {

list-style-type: none}ol.lst-kix_vf0l197cqv6l-5 {

list-style-type: none}ul.lst-kix_xoos54gyybzj-7 {

list-style-type: none}ul.lst-kix_xoos54gyybzj-8 {

list-style-type: none}.lst-kix_s3mi7ukxwiwf-0>li {

counter-increment: lst-ctn-kix_s3mi7ukxwiwf-0}ol.lst-kix_vf0l197cqv6l-8 {

list-style-type: none}.lst-kix_yly1729bcywk-2>li:before {

content: "" counter(lst-ctn-kix_yly1729bcywk-2, lower-roman) ". "}.lst-kix_fd1rucpc9vz2-5>li:before {

content: "\0025a0 "}.lst-kix_fd1rucpc9vz2-7>li:before {

content: "\0025cb "}ol.lst-kix_vf0l197cqv6l-2 {

list-style-type: none}.lst-kix_pcjo479wrta-5>li:before {

content: "\0025a0 "}.lst-kix_iv2x96orjh4l-5>li:before {

content: "\0025a0 "}ul.lst-kix_xoos54gyybzj-0 {

list-style-type: none}ol.lst-kix_vf0l197cqv6l-3 {

list-style-type: none}ul.lst-kix_xoos54gyybzj-1 {

list-style-type: none}ol.lst-kix_vf0l197cqv6l-0 {

list-style-type: none}ul.lst-kix_xoos54gyybzj-2 {

list-style-type: none}.lst-kix_yly1729bcywk-0>li:before {

content: "" counter(lst-ctn-kix_yly1729bcywk-0, decimal) ". "}.lst-kix_yly1729bcywk-8>li:before {

content: "" counter(lst-ctn-kix_yly1729bcywk-8, lower-roman) ". "}ul.lst-kix_xoos54gyybzj-3 {

list-style-type: none}.lst-kix_iv2x96orjh4l-3>li:before {

content: "\0025cf "}.lst-kix_5anu1k9tsyak-3>li:before {

content: "\0025cf "}.lst-kix_5anu1k9tsyak-5>li:before {

content: "\0025a0 "}.lst-kix_1wulu3ra2vwv-8>li {

counter-increment: lst-ctn-kix_1wulu3ra2vwv-8}ol.lst-kix_q8ok0mh9yyto-6 {

list-style-type: none}ol.lst-kix_q8ok0mh9yyto-5 {

list-style-type: none}ol.lst-kix_q8ok0mh9yyto-4 {

list-style-type: none}ol.lst-kix_q8ok0mh9yyto-3 {

list-style-type: none}.lst-kix_9jxnjym0nges-0>li:before {

content: "\0025cf "}ol.lst-kix_q8ok0mh9yyto-8 {

list-style-type: none}ol.lst-kix_q8ok0mh9yyto-7 {

list-style-type: none}.lst-kix_xoos54gyybzj-8>li:before {

content: "\0025a0 "}ol.lst-kix_emhp84jkv42c-0.start {

counter-reset: lst-ctn-kix_emhp84jkv42c-0 0}.lst-kix_opi66v2qdsjs-8>li:before {

content: "\0025a0 "}.lst-kix_ndaonzmgp8vn-4>li:before {

content: "\0025cb "}ol.lst-kix_q8ok0mh9yyto-2 {

list-style-type: none}ol.lst-kix_q8ok0mh9yyto-1 {

list-style-type: none}.lst-kix_9jxnjym0nges-2>li:before {

content: "\0025a0 "}ol.lst-kix_q8ok0mh9yyto-0 {

list-style-type: none}.lst-kix_xoos54gyybzj-6>li:before {

content: "\0025cf "}.lst-kix_ndaonzmgp8vn-2>li:before {

content: "\0025a0 "}.lst-kix_opi66v2qdsjs-2>li:before {

content: "\0025a0 "}.lst-kix_11a9ub9xa97v-0>li:before {

content: "" counter(lst-ctn-kix_11a9ub9xa97v-0, upper-roman) ". "}ol.lst-kix_bfzyeb917dp8-4.start {

counter-reset: lst-ctn-kix_bfzyeb917dp8-4 0}.lst-kix_q8ok0mh9yyto-3>li {

counter-increment: lst-ctn-kix_q8ok0mh9yyto-3}.lst-kix_xoos54gyybzj-0>li:before {

content: "\0025cf "}.lst-kix_11a9ub9xa97v-8>li:before {

content: "(" counter(lst-ctn-kix_11a9ub9xa97v-8, lower-roman) ") "}.lst-kix_86hsx13ssqid-0>li:before {

content: "\0025cf "}.lst-kix_86hsx13ssqid-6>li:before {

content: "\0025cf "}.lst-kix_9jxnjym0nges-8>li:before {

content: "\0025a0 "}.lst-kix_11a9ub9xa97v-6>li:before {

content: "(" counter(lst-ctn-kix_11a9ub9xa97v-6, lower-roman) ") "}ul.lst-kix_9jxnjym0nges-2 {

list-style-type: none}.lst-kix_xv318blpjdo-2>li:before {

content: "" counter(lst-ctn-kix_xv318blpjdo-2, decimal) ". "}ul.lst-kix_9jxnjym0nges-1 {

list-style-type: none}ul.lst-kix_9jxnjym0nges-4 {

list-style-type: none}ul.lst-kix_9jxnjym0nges-3 {

list-style-type: none}.lst-kix_h0kibz3smj6t-5>li:before {

content: "\0025a0 "}ul.lst-kix_9jxnjym0nges-6 {

list-style-type: none}ul.lst-kix_9jxnjym0nges-5 {

list-style-type: none}ul.lst-kix_9jxnjym0nges-8 {

list-style-type: none}ul.lst-kix_9jxnjym0nges-7 {

list-style-type: none}.lst-kix_xv318blpjdo-2>li {

counter-increment: lst-ctn-kix_xv318blpjdo-2}.lst-kix_f5kb4hocu5hh-3>li:before {

content: "\0025cf "}.lst-kix_s3mi7ukxwiwf-3>li {

counter-increment: lst-ctn-kix_s3mi7ukxwiwf-3}.lst-kix_bfzyeb917dp8-7>li {

counter-increment: lst-ctn-kix_bfzyeb917dp8-7}.lst-kix_f5kb4hocu5hh-8>li:before {

content: "\0025a0 "}ol.lst-kix_emhp84jkv42c-1.start {

counter-reset: lst-ctn-kix_emhp84jkv42c-1 0}.lst-kix_jkgkf1u9sy0c-4>li:before {

content: "\0025cb "}ol.lst-kix_jj5w63toozfm-3 {

list-style-type: none}ol.lst-kix_jj5w63toozfm-4 {

list-style-type: none}ol.lst-kix_jj5w63toozfm-5 {

list-style-type: none}.lst-kix_jkgkf1u9sy0c-7>li:before {

content: "\0025cb "}.lst-kix_xv318blpjdo-7>li:before {

content: "(" counter(lst-ctn-kix_xv318blpjdo-7, lower-latin) ") "}.lst-kix_686a8e4qhxwx-5>li:before {

content: "\0025a0 "}ol.lst-kix_jj5w63toozfm-6 {

list-style-type: none}ol.lst-kix_jj5w63toozfm-7 {

list-style-type: none}ol.lst-kix_jj5w63toozfm-8 {

list-style-type: none}.lst-kix_h0kibz3smj6t-2>li:before {

content: "\0025a0 "}.lst-kix_q8ok0mh9yyto-7>li {

counter-increment: lst-ctn-kix_q8ok0mh9yyto-7}ol.lst-kix_jj5w63toozfm-0 {

list-style-type: none}ol.lst-kix_jj5w63toozfm-1 {

list-style-type: none}.lst-kix_686a8e4qhxwx-2>li:before {

content: "\0025a0 "}ol.lst-kix_jj5w63toozfm-2 {

list-style-type: none}ol.lst-kix_11a9ub9xa97v-3 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-8.start {

counter-reset: lst-ctn-kix_bfzyeb917dp8-8 0}ol.lst-kix_11a9ub9xa97v-2 {

list-style-type: none}ol.lst-kix_11a9ub9xa97v-1 {

list-style-type: none}ol.lst-kix_11a9ub9xa97v-0 {

list-style-type: none}.lst-kix_b7256qmdgo85-2>li:before {

content: "\0025a0 "}ol.lst-kix_11a9ub9xa97v-8 {

list-style-type: none}ol.lst-kix_11a9ub9xa97v-7 {

list-style-type: none}ol.lst-kix_11a9ub9xa97v-6 {

list-style-type: none}ol.lst-kix_11a9ub9xa97v-5 {

list-style-type: none}.lst-kix_4m04az9jmmj8-7>li:before {

content: "\0025cb "}ol.lst-kix_11a9ub9xa97v-4 {

list-style-type: none}.lst-kix_b7256qmdgo85-5>li:before {

content: "\0025a0 "}.lst-kix_q97rvvc7c69e-1>li:before {

content: "\0025cb "}.lst-kix_yly1729bcywk-2>li {

counter-increment: lst-ctn-kix_yly1729bcywk-2}.lst-kix_q8ok0mh9yyto-5>li:before {

content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-5, lower-latin) ") "}.lst-kix_4m04az9jmmj8-4>li:before {

content: "\0025cb "}.lst-kix_bfzyeb917dp8-3>li {

counter-increment: lst-ctn-kix_bfzyeb917dp8-3}.lst-kix_ne7nl4nhpzqr-7>li:before {

content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-7, lower-latin) ". "}.lst-kix_q8ok0mh9yyto-8>li:before {

content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-8, lower-roman) ") "}ol.lst-kix_bfzyeb917dp8-5 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-4 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-3 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-2 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-8 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-7 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-6 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-1 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-0 {

list-style-type: none}ol.lst-kix_emhp84jkv42c-5.start {

counter-reset: lst-ctn-kix_emhp84jkv42c-5 0}.lst-kix_q8ok0mh9yyto-0>li {

counter-increment: lst-ctn-kix_q8ok0mh9yyto-0}.lst-kix_l7z426mwssm0-3>li:before {

content: "\0025cf "}.lst-kix_iv2x96orjh4l-8>li:before {

content: "\0025a0 "}.lst-kix_6qnkx7t1adn9-6>li:before {

content: "\0025cf "}.lst-kix_gfromclascha-5>li:before {

content: "\0025a0 "}.lst-kix_pcjo479wrta-2>li:before {

content: "\0025a0 "}ol.lst-kix_emhp84jkv42c-8.start {

counter-reset: lst-ctn-kix_emhp84jkv42c-8 0}.lst-kix_11a9ub9xa97v-8>li {

counter-increment: lst-ctn-kix_11a9ub9xa97v-8}.lst-kix_x1epm4iu41dp-5>li:before {

content: "\0025a0 "}.lst-kix_q97rvvc7c69e-4>li:before {

content: "\0025cb "}.lst-kix_xv318blpjdo-5>li {

counter-increment: lst-ctn-kix_xv318blpjdo-5}.lst-kix_1wulu3ra2vwv-5>li {

counter-increment: lst-ctn-kix_1wulu3ra2vwv-5}.lst-kix_5anu1k9tsyak-0>li:before {

content: "\0025cf "}.lst-kix_fy6y7gyjejoh-4>li:before {

content: "\0025cb "}.lst-kix_ndaonzmgp8vn-7>li:before {

content: "\0025cb "}.lst-kix_iv2x96orjh4l-0>li:before {

content: "\0025cf "}.lst-kix_yly1729bcywk-5>li:before {

content: "" counter(lst-ctn-kix_yly1729bcywk-5, lower-roman) ". "}.lst-kix_s3mi7ukxwiwf-2>li:before {

content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-2, lower-roman) ". "}.lst-kix_6ril5iwt0fcl-7>li:before {

content: "\0025cb "}.lst-kix_emhp84jkv42c-4>li:before {

content: "(" counter(lst-ctn-kix_emhp84jkv42c-4, decimal) ") "}.lst-kix_emhp84jkv42c-5>li {

counter-increment: lst-ctn-kix_emhp84jkv42c-5}.lst-kix_jj5w63toozfm-4>li:before {

content: "" counter(lst-ctn-kix_jj5w63toozfm-4, lower-latin) ". "}.lst-kix_1wulu3ra2vwv-5>li:before {

content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-5, lower-latin) ") "}ul.lst-kix_u0uqs69v9qbh-8 {

list-style-type: none}.lst-kix_xoos54gyybzj-3>li:before {

content: "\0025cf "}.lst-kix_11a9ub9xa97v-1>li {

counter-increment: lst-ctn-kix_11a9ub9xa97v-1}ul.lst-kix_u0uqs69v9qbh-4 {

list-style-type: none}.lst-kix_hchtl271h88l-6>li:before {

content: "\0025cf "}ul.lst-kix_u0uqs69v9qbh-5 {

list-style-type: none}.lst-kix_opi66v2qdsjs-5>li:before {

content: "\0025a0 "}.lst-kix_lemcawe54w5c-5>li:before {

content: "\0025a0 "}ul.lst-kix_u0uqs69v9qbh-6 {

list-style-type: none}ul.lst-kix_u0uqs69v9qbh-7 {

list-style-type: none}ul.lst-kix_u0uqs69v9qbh-0 {

list-style-type: none}ul.lst-kix_gyhqddkw9i05-6 {

list-style-type: none}ul.lst-kix_u0uqs69v9qbh-1 {

list-style-type: none}ul.lst-kix_gyhqddkw9i05-5 {

list-style-type: none}ul.lst-kix_u0uqs69v9qbh-2 {

list-style-type: none}ul.lst-kix_gyhqddkw9i05-8 {

list-style-type: none}ul.lst-kix_u0uqs69v9qbh-3 {

list-style-type: none}ul.lst-kix_gyhqddkw9i05-7 {

list-style-type: none}ol.lst-kix_emhp84jkv42c-7.start {

counter-reset: lst-ctn-kix_emhp84jkv42c-7 0}.lst-kix_fd1rucpc9vz2-2>li:before {

content: "\0025a0 "}ul.lst-kix_jkgkf1u9sy0c-4 {

list-style-type: none}ul.lst-kix_jkgkf1u9sy0c-5 {

list-style-type: none}ul.lst-kix_jkgkf1u9sy0c-6 {

list-style-type: none}ul.lst-kix_gyhqddkw9i05-0 {

list-style-type: none}ul.lst-kix_jkgkf1u9sy0c-7 {

list-style-type: none}.lst-kix_bfzyeb917dp8-2>li:before {

content: "" counter(lst-ctn-kix_bfzyeb917dp8-2, decimal) ". "}.lst-kix_gyhqddkw9i05-1>li:before {

content: "\0025cb "}ul.lst-kix_jkgkf1u9sy0c-8 {

list-style-type: none}ul.lst-kix_gyhqddkw9i05-2 {

list-style-type: none}ul.lst-kix_gyhqddkw9i05-1 {

list-style-type: none}ul.lst-kix_gyhqddkw9i05-4 {

list-style-type: none}ul.lst-kix_gyhqddkw9i05-3 {

list-style-type: none}.lst-kix_11a9ub9xa97v-3>li:before {

content: "" counter(lst-ctn-kix_11a9ub9xa97v-3, lower-latin) ") "}ol.lst-kix_emhp84jkv42c-6.start {

counter-reset: lst-ctn-kix_emhp84jkv42c-6 0}.lst-kix_8p26nc4xx5n8-1>li:before {

content: "\0025cb "}.lst-kix_u0uqs69v9qbh-5>li:before {

content: "\0025a0 "}.lst-kix_f5kb4hocu5hh-0>li:before {

content: "\0025cf "}.lst-kix_9jxnjym0nges-5>li:before {

content: "\0025a0 "}.lst-kix_86hsx13ssqid-3>li:before {

content: "\0025cf "}ul.lst-kix_jkgkf1u9sy0c-0 {

list-style-type: none}ul.lst-kix_jkgkf1u9sy0c-1 {

list-style-type: none}ul.lst-kix_jkgkf1u9sy0c-2 {

list-style-type: none}ul.lst-kix_jkgkf1u9sy0c-3 {

list-style-type: none}.lst-kix_vf0l197cqv6l-2>li {

counter-increment: lst-ctn-kix_vf0l197cqv6l-2}ol.lst-kix_jj5w63toozfm-5.start {

counter-reset: lst-ctn-kix_jj5w63toozfm-5 0}ul.lst-kix_bijol4nzhwf0-8 {

list-style-type: none}ol.lst-kix_emhp84jkv42c-0 {

list-style-type: none}ol.lst-kix_emhp84jkv42c-2 {

list-style-type: none}ol.lst-kix_emhp84jkv42c-1 {

list-style-type: none}ol.lst-kix_emhp84jkv42c-4 {

list-style-type: none}ol.lst-kix_emhp84jkv42c-3 {

list-style-type: none}ol.lst-kix_emhp84jkv42c-6 {

list-style-type: none}ol.lst-kix_emhp84jkv42c-5 {

list-style-type: none}ol.lst-kix_emhp84jkv42c-8 {

list-style-type: none}.lst-kix_yly1729bcywk-7>li {

counter-increment: lst-ctn-kix_yly1729bcywk-7}ol.lst-kix_emhp84jkv42c-7 {

list-style-type: none}.lst-kix_11a9ub9xa97v-4>li {

counter-increment: lst-ctn-kix_11a9ub9xa97v-4}.lst-kix_1qz6dmm9b14l-4>li:before {

content: "\0025cb "}.lst-kix_1qz6dmm9b14l-3>li:before {

content: "\0025cf "}.lst-kix_1qz6dmm9b14l-5>li:before {

content: "\0025a0 "}ul.lst-kix_j42a5dwgnqyq-0 {

list-style-type: none}ul.lst-kix_j42a5dwgnqyq-1 {

list-style-type: none}ul.lst-kix_j42a5dwgnqyq-2 {

list-style-type: none}ul.lst-kix_j42a5dwgnqyq-3 {

list-style-type: none}ul.lst-kix_j42a5dwgnqyq-4 {

list-style-type: none}ul.lst-kix_j42a5dwgnqyq-5 {

list-style-type: none}.lst-kix_1qz6dmm9b14l-0>li:before {

content: "\0025cf "}.lst-kix_1qz6dmm9b14l-8>li:before {

content: "\0025a0 "}ul.lst-kix_j42a5dwgnqyq-6 {

list-style-type: none}ul.lst-kix_j42a5dwgnqyq-7 {

list-style-type: none}.lst-kix_1qz6dmm9b14l-1>li:before {

content: "\0025cb "}ol.lst-kix_bfzyeb917dp8-0.start {

counter-reset: lst-ctn-kix_bfzyeb917dp8-0 0}ul.lst-kix_j42a5dwgnqyq-8 {

list-style-type: none}.lst-kix_1qz6dmm9b14l-2>li:before {

content: "\0025a0 "}ul.lst-kix_bijol4nzhwf0-4 {

list-style-type: none}ul.lst-kix_bijol4nzhwf0-5 {

list-style-type: none}ul.lst-kix_bijol4nzhwf0-6 {

list-style-type: none}ul.lst-kix_bijol4nzhwf0-7 {

list-style-type: none}ul.lst-kix_bijol4nzhwf0-0 {

list-style-type: none}ul.lst-kix_bijol4nzhwf0-1 {

list-style-type: none}ul.lst-kix_bijol4nzhwf0-2 {

list-style-type: none}ul.lst-kix_bijol4nzhwf0-3 {

list-style-type: none}.lst-kix_jj5w63toozfm-3>li:before {

content: "" counter(lst-ctn-kix_jj5w63toozfm-3, decimal) ". "}.lst-kix_1wulu3ra2vwv-2>li {

counter-increment: lst-ctn-kix_1wulu3ra2vwv-2}.lst-kix_1qz6dmm9b14l-7>li:before {

content: "\0025cb "}.lst-kix_jj5w63toozfm-2>li:before {

content: "" counter(lst-ctn-kix_jj5w63toozfm-2, lower-roman) ". "}.lst-kix_ne7nl4nhpzqr-3>li {

counter-increment: lst-ctn-kix_ne7nl4nhpzqr-3}.lst-kix_q8ok0mh9yyto-4>li {

counter-increment: lst-ctn-kix_q8ok0mh9yyto-4}.lst-kix_1qz6dmm9b14l-6>li:before {

content: "\0025cf "}.lst-kix_jj5w63toozfm-1>li:before {

content: "" counter(lst-ctn-kix_jj5w63toozfm-1, lower-latin) ". "}.lst-kix_h9mjmxara98n-7>li:before {

content: "\0025cb "}.lst-kix_bijol4nzhwf0-7>li:before {

content: "\0025cb "}.lst-kix_jj5w63toozfm-0>li:before {

content: "" counter(lst-ctn-kix_jj5w63toozfm-0, decimal) ". "}.lst-kix_h9mjmxara98n-6>li:before {

content: "\0025cf "}.lst-kix_h9mjmxara98n-8>li:before {

content: "\0025a0 "}.lst-kix_bijol4nzhwf0-6>li:before {

content: "\0025cf "}.lst-kix_bijol4nzhwf0-8>li:before {

content: "\0025a0 "}.lst-kix_h9mjmxara98n-5>li:before {

content: "\0025a0 "}.lst-kix_bijol4nzhwf0-5>li:before {

content: "\0025a0 "}.lst-kix_h9mjmxara98n-3>li:before {

content: "\0025cf "}.lst-kix_bijol4nzhwf0-3>li:before {

content: "\0025cf "}.lst-kix_h9mjmxara98n-2>li:before {

content: "\0025a0 "}.lst-kix_h9mjmxara98n-4>li:before {

content: "\0025cb "}.lst-kix_bijol4nzhwf0-2>li:before {

content: "\0025a0 "}.lst-kix_bijol4nzhwf0-4>li:before {

content: "\0025cb "}ol.lst-kix_q8ok0mh9yyto-1.start {

counter-reset: lst-ctn-kix_q8ok0mh9yyto-1 0}ol.lst-kix_s3mi7ukxwiwf-1.start {

counter-reset: lst-ctn-kix_s3mi7ukxwiwf-1 0}.lst-kix_h9mjmxara98n-0>li:before {

content: "\0025cf "}.lst-kix_bijol4nzhwf0-0>li:before {

content: "\0025cf "}.lst-kix_h9mjmxara98n-1>li:before {

content: "\0025cb "}.lst-kix_bijol4nzhwf0-1>li:before {

content: "\0025cb "}.lst-kix_jj5w63toozfm-8>li {

counter-increment: lst-ctn-kix_jj5w63toozfm-8}ol.lst-kix_ne7nl4nhpzqr-3.start {

counter-reset: lst-ctn-kix_ne7nl4nhpzqr-3 0}ul.lst-kix_gfromclascha-0 {

list-style-type: none}ol.lst-kix_emhp84jkv42c-2.start {

counter-reset: lst-ctn-kix_emhp84jkv42c-2 0}.lst-kix_l7z426mwssm0-2>li:before {

content: "\0025a0 "}.lst-kix_ne7nl4nhpzqr-4>li:before {

content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-4, lower-latin) ". "}.lst-kix_l7z426mwssm0-0>li:before {

content: "\0025cf "}.lst-kix_l7z426mwssm0-4>li:before {

content: "\0025cb "}ul.lst-kix_gfromclascha-7 {

list-style-type: none}ul.lst-kix_gfromclascha-8 {

list-style-type: none}ul.lst-kix_gfromclascha-5 {

list-style-type: none}.lst-kix_ne7nl4nhpzqr-0>li:before {

content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-0, decimal) ". "}.lst-kix_ne7nl4nhpzqr-2>li:before {

content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-2, lower-roman) ". "}ul.lst-kix_gfromclascha-6 {

list-style-type: none}.lst-kix_x1epm4iu41dp-8>li:before {

content: "\0025a0 "}ul.lst-kix_gfromclascha-3 {

list-style-type: none}ul.lst-kix_gfromclascha-4 {

list-style-type: none}ul.lst-kix_gfromclascha-1 {

list-style-type: none}.lst-kix_bfzyeb917dp8-3>li:before {

content: "" counter(lst-ctn-kix_bfzyeb917dp8-3, lower-latin) ") "}ul.lst-kix_gfromclascha-2 {

list-style-type: none}ul.lst-kix_opi66v2qdsjs-3 {

list-style-type: none}.lst-kix_x1epm4iu41dp-2>li:before {

content: "\0025a0 "}ol.lst-kix_11a9ub9xa97v-1.start {

counter-reset: lst-ctn-kix_11a9ub9xa97v-1 0}ul.lst-kix_opi66v2qdsjs-2 {

list-style-type: none}ul.lst-kix_opi66v2qdsjs-1 {

list-style-type: none}ul.lst-kix_opi66v2qdsjs-0 {

list-style-type: none}.lst-kix_q8ok0mh9yyto-0>li:before {

content: "" counter(lst-ctn-kix_q8ok0mh9yyto-0, upper-roman) ". "}.lst-kix_fy6y7gyjejoh-3>li:before {

content: "\0025cf "}.lst-kix_bfzyeb917dp8-5>li:before {

content: "(" counter(lst-ctn-kix_bfzyeb917dp8-5, lower-latin) ") "}.lst-kix_jj5w63toozfm-0>li {

counter-increment: lst-ctn-kix_jj5w63toozfm-0}.lst-kix_x1epm4iu41dp-6>li:before {

content: "\0025cf "}ul.lst-kix_opi66v2qdsjs-8 {

list-style-type: none}ul.lst-kix_opi66v2qdsjs-7 {

list-style-type: none}.lst-kix_x1epm4iu41dp-4>li:before {

content: "\0025cb "}ul.lst-kix_opi66v2qdsjs-6 {

list-style-type: none}ul.lst-kix_opi66v2qdsjs-5 {

list-style-type: none}.lst-kix_fy6y7gyjejoh-1>li:before {

content: "\0025cb "}ul.lst-kix_opi66v2qdsjs-4 {

list-style-type: none}.lst-kix_bfzyeb917dp8-7>li:before {

content: "(" counter(lst-ctn-kix_bfzyeb917dp8-7, lower-latin) ") "}.lst-kix_emhp84jkv42c-7>li {

counter-increment: lst-ctn-kix_emhp84jkv42c-7}.lst-kix_fy6y7gyjejoh-7>li:before {

content: "\0025cb "}ol.lst-kix_xv318blpjdo-1.start {

counter-reset: lst-ctn-kix_xv318blpjdo-1 0}.lst-kix_x1epm4iu41dp-0>li:before {

content: "\0025cf "}ol.lst-kix_vf0l197cqv6l-0.start {

counter-reset: lst-ctn-kix_vf0l197cqv6l-0 0}.lst-kix_fy6y7gyjejoh-5>li:before {

content: "\0025a0 "}.lst-kix_emhp84jkv42c-3>li:before {

content: "" counter(lst-ctn-kix_emhp84jkv42c-3, lower-latin) ") "}.lst-kix_emhp84jkv42c-5>li:before {

content: "(" counter(lst-ctn-kix_emhp84jkv42c-5, lower-latin) ") "}.lst-kix_lemcawe54w5c-8>li:before {

content: "\0025a0 "}ol.lst-kix_yly1729bcywk-4.start {

counter-reset: lst-ctn-kix_yly1729bcywk-4 0}.lst-kix_emhp84jkv42c-1>li:before {

content: "" counter(lst-ctn-kix_emhp84jkv42c-1, upper-latin) ". "}.lst-kix_emhp84jkv42c-7>li:before {

content: "(" counter(lst-ctn-kix_emhp84jkv42c-7, lower-latin) ") "}.lst-kix_lemcawe54w5c-6>li:before {

content: "\0025cf "}.lst-kix_jj5w63toozfm-5>li:before {

content: "" counter(lst-ctn-kix_jj5w63toozfm-5, lower-roman) ". "}.lst-kix_bfzyeb917dp8-2>li {

counter-increment: lst-ctn-kix_bfzyeb917dp8-2}ul.lst-kix_1qz6dmm9b14l-6 {

list-style-type: none}.lst-kix_lemcawe54w5c-4>li:before {

content: "\0025cb "}.lst-kix_gyhqddkw9i05-8>li:before {

content: "\0025a0 "}.lst-kix_jj5w63toozfm-7>li:before {

content: "" counter(lst-ctn-kix_jj5w63toozfm-7, lower-latin) ". "}ul.lst-kix_1qz6dmm9b14l-5 {

list-style-type: none}ul.lst-kix_1qz6dmm9b14l-8 {

list-style-type: none}ul.lst-kix_1qz6dmm9b14l-7 {

list-style-type: none}.lst-kix_jj5w63toozfm-1>li {

counter-increment: lst-ctn-kix_jj5w63toozfm-1}ul.lst-kix_1qz6dmm9b14l-2 {

list-style-type: none}ul.lst-kix_1qz6dmm9b14l-1 {

list-style-type: none}ul.lst-kix_1qz6dmm9b14l-4 {

list-style-type: none}ul.lst-kix_1qz6dmm9b14l-3 {

list-style-type: none}.lst-kix_u0uqs69v9qbh-0>li:before {

content: "\0025cf "}.lst-kix_u0uqs69v9qbh-4>li:before {

content: "\0025cb "}ul.lst-kix_1qz6dmm9b14l-0 {

list-style-type: none}.lst-kix_s3mi7ukxwiwf-6>li {

counter-increment: lst-ctn-kix_s3mi7ukxwiwf-6}.lst-kix_jj5w63toozfm-7>li {

counter-increment: lst-ctn-kix_jj5w63toozfm-7}.lst-kix_lemcawe54w5c-2>li:before {

content: "\0025a0 "}.lst-kix_u0uqs69v9qbh-2>li:before {

content: "\0025a0 "}.lst-kix_8p26nc4xx5n8-6>li:before {

content: "\0025cf "}ol.lst-kix_1wulu3ra2vwv-4.start {

counter-reset: lst-ctn-kix_1wulu3ra2vwv-4 0}.lst-kix_l7z426mwssm0-8>li:before {

content: "\0025a0 "}.lst-kix_u0uqs69v9qbh-8>li:before {

content: "\0025a0 "}.lst-kix_bfzyeb917dp8-1>li:before {

content: "" counter(lst-ctn-kix_bfzyeb917dp8-1, upper-latin) ". "}ul.lst-kix_ekmayt81kvbz-8 {

list-style-type: none}.lst-kix_gyhqddkw9i05-0>li:before {

content: "\0025cf "}ul.lst-kix_ekmayt81kvbz-7 {

list-style-type: none}.lst-kix_gyhqddkw9i05-4>li:before {

content: "\0025cb "}.lst-kix_l7z426mwssm0-6>li:before {

content: "\0025cf "}.lst-kix_8p26nc4xx5n8-2>li:before {

content: "\0025a0 "}ul.lst-kix_ekmayt81kvbz-6 {

list-style-type: none}ul.lst-kix_ekmayt81kvbz-5 {

list-style-type: none}.lst-kix_lemcawe54w5c-0>li:before {

content: "\0025cf "}ul.lst-kix_ekmayt81kvbz-4 {

list-style-type: none}ul.lst-kix_ekmayt81kvbz-3 {

list-style-type: none}.lst-kix_gyhqddkw9i05-6>li:before {

content: "\0025cf "}.lst-kix_8p26nc4xx5n8-0>li:before {

content: "\0025cf "}.lst-kix_8p26nc4xx5n8-8>li:before {

content: "\0025a0 "}ul.lst-kix_ekmayt81kvbz-2 {

list-style-type: none}ul.lst-kix_ekmayt81kvbz-1 {

list-style-type: none}.lst-kix_u0uqs69v9qbh-6>li:before {

content: "\0025cf "}ul.lst-kix_ekmayt81kvbz-0 {

list-style-type: none}ol.lst-kix_s3mi7ukxwiwf-1 {

list-style-type: none}ol.lst-kix_bfzyeb917dp8-5.start {

counter-reset: lst-ctn-kix_bfzyeb917dp8-5 0}ol.lst-kix_s3mi7ukxwiwf-2 {

list-style-type: none}ol.lst-kix_s3mi7ukxwiwf-0 {

list-style-type: none}ul.lst-kix_7tib3jrzu2u9-1 {

list-style-type: none}ol.lst-kix_s3mi7ukxwiwf-5 {

list-style-type: none}ul.lst-kix_7tib3jrzu2u9-2 {

list-style-type: none}ol.lst-kix_s3mi7ukxwiwf-6 {

list-style-type: none}ol.lst-kix_s3mi7ukxwiwf-3 {

list-style-type: none}ul.lst-kix_7tib3jrzu2u9-0 {

list-style-type: none}ol.lst-kix_s3mi7ukxwiwf-4 {

list-style-type: none}ul.lst-kix_7tib3jrzu2u9-5 {

list-style-type: none}ul.lst-kix_7tib3jrzu2u9-6 {

list-style-type: none}ul.lst-kix_7tib3jrzu2u9-3 {

list-style-type: none}ol.lst-kix_s3mi7ukxwiwf-7 {

list-style-type: none}ul.lst-kix_7tib3jrzu2u9-4 {

list-style-type: none}ol.lst-kix_s3mi7ukxwiwf-8 {

list-style-type: none}.lst-kix_gyhqddkw9i05-2>li:before {

content: "\0025a0 "}.lst-kix_8p26nc4xx5n8-4>li:before {

content: "\0025cb "}ul.lst-kix_7tib3jrzu2u9-7 {

list-style-type: none}ul.lst-kix_7tib3jrzu2u9-8 {

list-style-type: none}ol.lst-kix_ne7nl4nhpzqr-7.start {

counter-reset: lst-ctn-kix_ne7nl4nhpzqr-7 0}.lst-kix_yly1729bcywk-6>li {

counter-increment: lst-ctn-kix_yly1729bcywk-6}.lst-kix_xv318blpjdo-1>li:before {

content: "" counter(lst-ctn-kix_xv318blpjdo-1, upper-latin) ". "}.lst-kix_xv318blpjdo-0>li:before {

content: "" counter(lst-ctn-kix_xv318blpjdo-0, upper-roman) ". "}.lst-kix_h0kibz3smj6t-4>li:before {

content: "\0025cb "}.lst-kix_ne7nl4nhpzqr-4>li {

counter-increment: lst-ctn-kix_ne7nl4nhpzqr-4}.lst-kix_1wulu3ra2vwv-1>li {

counter-increment: lst-ctn-kix_1wulu3ra2vwv-1}.lst-kix_h0kibz3smj6t-7>li:before {

content: "\0025cb "}.lst-kix_h0kibz3smj6t-8>li:before {

content: "\0025a0 "}.lst-kix_11a9ub9xa97v-5>li {

counter-increment: lst-ctn-kix_11a9ub9xa97v-5}.lst-kix_opi66v2qdsjs-0>li:before {

content: "\0025cf "}.lst-kix_686a8e4qhxwx-7>li:before {

content: "\0025cb "}.lst-kix_xv318blpjdo-8>li:before {

content: "(" counter(lst-ctn-kix_xv318blpjdo-8, lower-roman) ") "}.lst-kix_xv318blpjdo-5>li:before {

content: "(" counter(lst-ctn-kix_xv318blpjdo-5, lower-latin) ") "}.lst-kix_h0kibz3smj6t-3>li:before {

content: "\0025cf "}.lst-kix_686a8e4qhxwx-3>li:before {

content: "\0025cf "}.lst-kix_686a8e4qhxwx-4>li:before {

content: "\0025cb "}.lst-kix_xv318blpjdo-4>li:before {

content: "(" counter(lst-ctn-kix_xv318blpjdo-4, decimal) ") "}.lst-kix_h0kibz3smj6t-0>li:before {

content: "\0025cf "}ol.lst-kix_vf0l197cqv6l-4.start {

counter-reset: lst-ctn-kix_vf0l197cqv6l-4 0}ol.lst-kix_ne7nl4nhpzqr-2.start {

counter-reset: lst-ctn-kix_ne7nl4nhpzqr-2 0}ol.lst-kix_11a9ub9xa97v-0.start {

counter-reset: lst-ctn-kix_11a9ub9xa97v-0 0}.lst-kix_s3mi7ukxwiwf-7>li {

counter-increment: lst-ctn-kix_s3mi7ukxwiwf-7}ul.lst-kix_l7z426mwssm0-1 {

list-style-type: none}ul.lst-kix_l7z426mwssm0-2 {

list-style-type: none}ul.lst-kix_l7z426mwssm0-0 {

list-style-type: none}ol.lst-kix_yly1729bcywk-8.start {

counter-reset: lst-ctn-kix_yly1729bcywk-8 0}.lst-kix_ne7nl4nhpzqr-2>li {

counter-increment: lst-ctn-kix_ne7nl4nhpzqr-2}.lst-kix_q8ok0mh9yyto-3>li:before {

content: "" counter(lst-ctn-kix_q8ok0mh9yyto-3, lower-latin) ") "}.lst-kix_pcjo479wrta-7>li:before {

content: "\0025cb "}.lst-kix_686a8e4qhxwx-8>li:before {

content: "\0025a0 "}.lst-kix_emhp84jkv42c-6>li {

counter-increment: lst-ctn-kix_emhp84jkv42c-6}ul.lst-kix_l7z426mwssm0-7 {

list-style-type: none}ul.lst-kix_l7z426mwssm0-8 {

list-style-type: none}.lst-kix_q8ok0mh9yyto-2>li:before {

content: "" counter(lst-ctn-kix_q8ok0mh9yyto-2, decimal) ". "}.lst-kix_pcjo479wrta-8>li:before {

content: "\0025a0 "}ul.lst-kix_l7z426mwssm0-5 {

list-style-type: none}ul.lst-kix_l7z426mwssm0-6 {

list-style-type: none}ul.lst-kix_l7z426mwssm0-3 {

list-style-type: none}ul.lst-kix_l7z426mwssm0-4 {

list-style-type: none}.lst-kix_yly1729bcywk-8>li {

counter-increment: lst-ctn-kix_yly1729bcywk-8}.lst-kix_vf0l197cqv6l-3>li {

counter-increment: lst-ctn-kix_vf0l197cqv6l-3}.lst-kix_q8ok0mh9yyto-6>li:before {

content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-6, lower-roman) ") "}.lst-kix_4m04az9jmmj8-2>li:before {

content: "\0025a0 "}.lst-kix_4m04az9jmmj8-6>li:before {

content: "\0025cf "}.lst-kix_q8ok0mh9yyto-7>li:before {

content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-7, lower-latin) ") "}.lst-kix_4m04az9jmmj8-1>li:before {

content: "\0025cb "}.lst-kix_4m04az9jmmj8-5>li:before {

content: "\0025a0 "}ol.lst-kix_vf0l197cqv6l-5.start {

counter-reset: lst-ctn-kix_vf0l197cqv6l-5 0}.lst-kix_ne7nl4nhpzqr-8>li:before {

content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-8, lower-roman) ". "}.lst-kix_xv318blpjdo-4>li {

counter-increment: lst-ctn-kix_xv318blpjdo-4}.lst-kix_vf0l197cqv6l-8>li {

counter-increment: lst-ctn-kix_vf0l197cqv6l-8}.lst-kix_ne7nl4nhpzqr-5>li:before {

content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-5, lower-roman) ". "}.lst-kix_l7z426mwssm0-1>li:before {

content: "\0025cb "}.lst-kix_x1epm4iu41dp-7>li:before {

content: "\0025cb "}.lst-kix_yly1729bcywk-1>li {

counter-increment: lst-ctn-kix_yly1729bcywk-1}.lst-kix_6qnkx7t1adn9-4>li:before {

content: "\0025cb "}.lst-kix_6qnkx7t1adn9-8>li:before {

content: "\0025a0 "}.lst-kix_xv318blpjdo-6>li {

counter-increment: lst-ctn-kix_xv318blpjdo-6}ol.lst-kix_jj5w63toozfm-1.start {

counter-reset: lst-ctn-kix_jj5w63toozfm-1 0}.lst-kix_ne7nl4nhpzqr-1>li:before {

content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-1, lower-latin) ". "}.lst-kix_pcjo479wrta-4>li:before {

content: "\0025cb "}ol.lst-kix_ne7nl4nhpzqr-8.start {

counter-reset: lst-ctn-kix_ne7nl4nhpzqr-8 0}.lst-kix_bfzyeb917dp8-4>li:before {

content: "(" counter(lst-ctn-kix_bfzyeb917dp8-4, decimal) ") "}.lst-kix_x1epm4iu41dp-3>li:before {

content: "\0025cf "}.lst-kix_fd1rucpc9vz2-8>li:before {

content: "\0025a0 "}.lst-kix_bfzyeb917dp8-8>li:before {

content: "(" counter(lst-ctn-kix_bfzyeb917dp8-8, lower-roman) ") "}.lst-kix_fy6y7gyjejoh-2>li:before {

content: "\0025a0 "}.lst-kix_fy6y7gyjejoh-6>li:before {

content: "\0025cf "}ol.lst-kix_1wulu3ra2vwv-8.start {

counter-reset: lst-ctn-kix_1wulu3ra2vwv-8 0}.lst-kix_pcjo479wrta-0>li:before {

content: "\0025cf "}ol.lst-kix_s3mi7ukxwiwf-6.start {

counter-reset: lst-ctn-kix_s3mi7ukxwiwf-6 0}ol.lst-kix_jj5w63toozfm-0.start {

counter-reset: lst-ctn-kix_jj5w63toozfm-0 0}.lst-kix_emhp84jkv42c-2>li:before {

content: "" counter(lst-ctn-kix_emhp84jkv42c-2, decimal) ". "}.lst-kix_emhp84jkv42c-6>li:before {

content: "(" counter(lst-ctn-kix_emhp84jkv42c-6, lower-roman) ") "}.lst-kix_686a8e4qhxwx-0>li:before {

content: "\0025cf "}.lst-kix_ndaonzmgp8vn-5>li:before {

content: "\0025a0 "}.lst-kix_9jxnjym0nges-3>li:before {

content: "\0025cf "}.lst-kix_opi66v2qdsjs-7>li:before {

content: "\0025cb "}.lst-kix_lemcawe54w5c-7>li:before {

content: "\0025cb "}.lst-kix_ndaonzmgp8vn-1>li:before {

content: "\0025cb "}.lst-kix_gyhqddkw9i05-7>li:before {

content: "\0025cb "}.lst-kix_jj5w63toozfm-6>li:before {

content: "" counter(lst-ctn-kix_jj5w63toozfm-6, decimal) ". "}.lst-kix_u0uqs69v9qbh-3>li:before {

content: "\0025cf "}.lst-kix_fd1rucpc9vz2-0>li:before {

content: "\0025cf "}.lst-kix_fd1rucpc9vz2-4>li:before {

content: "\0025cb "}ol.lst-kix_s3mi7ukxwiwf-5.start {

counter-reset: lst-ctn-kix_s3mi7ukxwiwf-5 0}.lst-kix_opi66v2qdsjs-3>li:before {

content: "\0025cf "}.lst-kix_lemcawe54w5c-3>li:before {

content: "\0025cf "}.lst-kix_8p26nc4xx5n8-3>li:before {

content: "\0025cf "}.lst-kix_8p26nc4xx5n8-7>li:before {

content: "\0025cb "}.lst-kix_l7z426mwssm0-5>li:before {

content: "\0025a0 "}.lst-kix_u0uqs69v9qbh-7>li:before {

content: "\0025cb "}.lst-kix_bfzyeb917dp8-0>li:before {

content: "" counter(lst-ctn-kix_bfzyeb917dp8-0, upper-roman) ". "}.lst-kix_11a9ub9xa97v-1>li:before {

content: "" counter(lst-ctn-kix_11a9ub9xa97v-1, upper-latin) ". "}.lst-kix_gyhqddkw9i05-3>li:before {

content: "\0025cf "}.lst-kix_9jxnjym0nges-7>li:before {

content: "\0025cb "}.lst-kix_11a9ub9xa97v-5>li:before {

content: "(" counter(lst-ctn-kix_11a9ub9xa97v-5, lower-latin) ") "}ol.lst-kix_11a9ub9xa97v-2.start {

counter-reset: lst-ctn-kix_11a9ub9xa97v-2 0}.lst-kix_s3mi7ukxwiwf-4>li {

counter-increment: lst-ctn-kix_s3mi7ukxwiwf-4}.lst-kix_7tib3jrzu2u9-4>li:before {

content: "\0025cb "}.lst-kix_ne7nl4nhpzqr-5>li {

counter-increment: lst-ctn-kix_ne7nl4nhpzqr-5}ol.lst-kix_xv318blpjdo-4 {

list-style-type: none}ol.lst-kix_s3mi7ukxwiwf-7.start {

counter-reset: lst-ctn-kix_s3mi7ukxwiwf-7 0}ol.lst-kix_xv318blpjdo-5 {

list-style-type: none}ol.lst-kix_xv318blpjdo-6 {

list-style-type: none}ol.lst-kix_xv318blpjdo-7 {

list-style-type: none}ol.lst-kix_xv318blpjdo-0 {

list-style-type: none}ol.lst-kix_xv318blpjdo-1 {

list-style-type: none}.lst-kix_7tib3jrzu2u9-1>li:before {

content: "\0025cb "}ol.lst-kix_ne7nl4nhpzqr-4.start {

counter-reset: lst-ctn-kix_ne7nl4nhpzqr-4 0}ol.lst-kix_xv318blpjdo-2 {

list-style-type: none}ol.lst-kix_xv318blpjdo-3 {

list-style-type: none}.lst-kix_q8ok0mh9yyto-6>li {

counter-increment: lst-ctn-kix_q8ok0mh9yyto-6}ul.lst-kix_5anu1k9tsyak-7 {

list-style-type: none}.lst-kix_jj5w63toozfm-6>li {

counter-increment: lst-ctn-kix_jj5w63toozfm-6}ul.lst-kix_5anu1k9tsyak-8 {

list-style-type: none}ul.lst-kix_5anu1k9tsyak-5 {

list-style-type: none}ol.lst-kix_yly1729bcywk-5.start {

counter-reset: lst-ctn-kix_yly1729bcywk-5 0}.lst-kix_11a9ub9xa97v-2>li {

counter-increment: lst-ctn-kix_11a9ub9xa97v-2}ol.lst-kix_1wulu3ra2vwv-0 {

list-style-type: none}ul.lst-kix_5anu1k9tsyak-6 {

list-style-type: none}ol.lst-kix_1wulu3ra2vwv-1 {

list-style-type: none}ul.lst-kix_5anu1k9tsyak-3 {

list-style-type: none}ul.lst-kix_5anu1k9tsyak-4 {

list-style-type: none}ul.lst-kix_5anu1k9tsyak-1 {

list-style-type: none}.lst-kix_xv318blpjdo-3>li {

counter-increment: lst-ctn-kix_xv318blpjdo-3}ul.lst-kix_5anu1k9tsyak-2 {

list-style-type: none}ol.lst-kix_1wulu3ra2vwv-6 {

list-style-type: none}ul.lst-kix_5anu1k9tsyak-0 {

list-style-type: none}ol.lst-kix_1wulu3ra2vwv-7 {

list-style-type: none}ol.lst-kix_1wulu3ra2vwv-8 {

list-style-type: none}.lst-kix_7tib3jrzu2u9-6>li:before {

content: "\0025cf "}ol.lst-kix_xv318blpjdo-8 {

list-style-type: none}ol.lst-kix_1wulu3ra2vwv-2 {

list-style-type: none}ol.lst-kix_1wulu3ra2vwv-3 {

list-style-type: none}.lst-kix_7tib3jrzu2u9-7>li:before {

content: "\0025cb "}ol.lst-kix_1wulu3ra2vwv-4 {

list-style-type: none}ol.lst-kix_1wulu3ra2vwv-5 {

list-style-type: none}.lst-kix_vf0l197cqv6l-4>li {

counter-increment: lst-ctn-kix_vf0l197cqv6l-4}ol.lst-kix_1wulu3ra2vwv-5.start {

counter-reset: lst-ctn-kix_1wulu3ra2vwv-5 0}ol.lst-kix_11a9ub9xa97v-7.start {

counter-reset: lst-ctn-kix_11a9ub9xa97v-7 0}ol.lst-kix_q8ok0mh9yyto-2.start {

counter-reset: lst-ctn-kix_q8ok0mh9yyto-2 0}.lst-kix_11a9ub9xa97v-6>li {

counter-increment: lst-ctn-kix_11a9ub9xa97v-6}.lst-kix_5anu1k9tsyak-7>li:before {

content: "\0025cb "}.lst-kix_j42a5dwgnqyq-6>li:before {

content: "\0025cf "}ol.lst-kix_xv318blpjdo-2.start {

counter-reset: lst-ctn-kix_xv318blpjdo-2 0}.lst-kix_1wulu3ra2vwv-4>li {

counter-increment: lst-ctn-kix_1wulu3ra2vwv-4}.lst-kix_q8ok0mh9yyto-2>li {

counter-increment: lst-ctn-kix_q8ok0mh9yyto-2}ol.lst-kix_jj5w63toozfm-4.start {

counter-reset: lst-ctn-kix_jj5w63toozfm-4 0}.lst-kix_vf0l197cqv6l-0>li {

counter-increment: lst-ctn-kix_vf0l197cqv6l-0}ol.lst-kix_yly1729bcywk-0.start {

counter-reset: lst-ctn-kix_yly1729bcywk-0 0}.lst-kix_6qnkx7t1adn9-2>li:before {

content: "\0025a0 "}.lst-kix_qeqyxe7gm97l-6>li:before {

content: "\0025cf "}.lst-kix_qeqyxe7gm97l-4>li:before {

content: "\0025cb "}.lst-kix_j42a5dwgnqyq-1>li:before {

content: "\0025cb "}.lst-kix_qeqyxe7gm97l-1>li:before {

content: "\0025cb "}.lst-kix_qeqyxe7gm97l-3>li:before {

content: "\0025cf "}.lst-kix_j42a5dwgnqyq-4>li:before {

content: "\0025cb "}ol.lst-kix_1wulu3ra2vwv-0.start {

counter-reset: lst-ctn-kix_1wulu3ra2vwv-0 0}ol.lst-kix_q8ok0mh9yyto-7.start {

counter-reset: lst-ctn-kix_q8ok0mh9yyto-7 0}.lst-kix_j42a5dwgnqyq-3>li:before {

content: "\0025cf "}.lst-kix_jj5w63toozfm-2>li {

counter-increment: lst-ctn-kix_jj5w63toozfm-2}ol.lst-kix_1wulu3ra2vwv-3.start {

counter-reset: lst-ctn-kix_1wulu3ra2vwv-3 0}ol.lst-kix_q8ok0mh9yyto-0.start {

counter-reset: lst-ctn-kix_q8ok0mh9yyto-0 0}.lst-kix_6qnkx7t1adn9-5>li:before {

content: "\0025a0 "}.lst-kix_6qnkx7t1adn9-7>li:before {

content: "\0025cb "}ol.lst-kix_yly1729bcywk-3.start {

counter-reset: lst-ctn-kix_yly1729bcywk-3 0}.lst-kix_iv2x96orjh4l-7>li:before {

content: "\0025cb "}.lst-kix_pcjo479wrta-3>li:before {

content: "\0025cf "}.lst-kix_yly1729bcywk-6>li:before {

content: "" counter(lst-ctn-kix_yly1729bcywk-6, decimal) ". "}.lst-kix_ndaonzmgp8vn-6>li:before {

content: "\0025cf "}.lst-kix_5anu1k9tsyak-1>li:before {

content: "\0025cb "}.lst-kix_ndaonzmgp8vn-8>li:before {

content: "\0025a0 "}.lst-kix_pcjo479wrta-1>li:before {

content: "\0025cb "}.lst-kix_iv2x96orjh4l-1>li:before {

content: "\0025cb "}.lst-kix_yly1729bcywk-4>li:before {

content: "" counter(lst-ctn-kix_yly1729bcywk-4, lower-latin) ". "}.lst-kix_bfzyeb917dp8-8>li {

counter-increment: lst-ctn-kix_bfzyeb917dp8-8}.lst-kix_ne7nl4nhpzqr-1>li {

counter-increment: lst-ctn-kix_ne7nl4nhpzqr-1}.lst-kix_opi66v2qdsjs-4>li:before {

content: "\0025cb "}.lst-kix_fd1rucpc9vz2-1>li:before {

content: "\0025cb "}.lst-kix_fd1rucpc9vz2-3>li:before {

content: "\0025cf "}.lst-kix_opi66v2qdsjs-6>li:before {

content: "\0025cf "}ol.lst-kix_11a9ub9xa97v-4.start {

counter-reset: lst-ctn-kix_11a9ub9xa97v-4 0}.lst-kix_xoos54gyybzj-4>li:before {

content: "\0025cb "}.lst-kix_bfzyeb917dp8-1>li {

counter-increment: lst-ctn-kix_bfzyeb917dp8-1}.lst-kix_ndaonzmgp8vn-0>li:before {

content: "\0025cf "}ol.lst-kix_jj5w63toozfm-6.start {

counter-reset: lst-ctn-kix_jj5w63toozfm-6 0}.lst-kix_xoos54gyybzj-2>li:before {

content: "\0025a0 "}ul.lst-kix_b7256qmdgo85-6 {

list-style-type: none}ul.lst-kix_b7256qmdgo85-7 {

list-style-type: none}.lst-kix_1wulu3ra2vwv-3>li {

counter-increment: lst-ctn-kix_1wulu3ra2vwv-3}ul.lst-kix_b7256qmdgo85-8 {

list-style-type: none}ul.lst-kix_b7256qmdgo85-2 {

list-style-type: none}ul.lst-kix_b7256qmdgo85-3 {

list-style-type: none}.lst-kix_11a9ub9xa97v-4>li:before {

content: "(" counter(lst-ctn-kix_11a9ub9xa97v-4, decimal) ") "}ul.lst-kix_b7256qmdgo85-4 {

list-style-type: none}ul.lst-kix_b7256qmdgo85-5 {

list-style-type: none}.lst-kix_f5kb4hocu5hh-1>li:before {

content: "\0025cb "}.lst-kix_11a9ub9xa97v-2>li:before {

content: "" counter(lst-ctn-kix_11a9ub9xa97v-2, decimal) ". "}.lst-kix_9jxnjym0nges-4>li:before {

content: "\0025cb "}.lst-kix_86hsx13ssqid-4>li:before {

content: "\0025cb "}ul.lst-kix_b7256qmdgo85-0 {

list-style-type: none}ul.lst-kix_b7256qmdgo85-1 {

list-style-type: none}.lst-kix_9jxnjym0nges-6>li:before {

content: "\0025cf "}.lst-kix_86hsx13ssqid-2>li:before {

content: "\0025a0 "}.lst-kix_bfzyeb917dp8-5>li {

counter-increment: lst-ctn-kix_bfzyeb917dp8-5}.lst-kix_h0kibz3smj6t-6>li:before {

content: "\0025cf "}.lst-kix_11a9ub9xa97v-3>li {

counter-increment: lst-ctn-kix_11a9ub9xa97v-3}ol.lst-kix_11a9ub9xa97v-5.start {

counter-reset: lst-ctn-kix_11a9ub9xa97v-5 0}ul.lst-kix_x1epm4iu41dp-0 {

list-style-type: none}.lst-kix_f5kb4hocu5hh-4>li:before {

content: "\0025cb "}ol.lst-kix_xv318blpjdo-0.start {

counter-reset: lst-ctn-kix_xv318blpjdo-0 0}.lst-kix_jkgkf1u9sy0c-0>li:before {

content: "\0025cf "}.lst-kix_f5kb4hocu5hh-7>li:before {

content: "\0025cb "}ul.lst-kix_x1epm4iu41dp-6 {

list-style-type: none}ul.lst-kix_x1epm4iu41dp-5 {

list-style-type: none}ul.lst-kix_x1epm4iu41dp-8 {

list-style-type: none}.lst-kix_jkgkf1u9sy0c-3>li:before {

content: "\0025cf "}ul.lst-kix_x1epm4iu41dp-7 {

list-style-type: none}ul.lst-kix_x1epm4iu41dp-2 {

list-style-type: none}.lst-kix_xv318blpjdo-0>li {

counter-increment: lst-ctn-kix_xv318blpjdo-0}ol.lst-kix_jj5w63toozfm-8.start {

counter-reset: lst-ctn-kix_jj5w63toozfm-8 0}ul.lst-kix_x1epm4iu41dp-1 {

list-style-type: none}ul.lst-kix_x1epm4iu41dp-4 {

list-style-type: none}ul.lst-kix_x1epm4iu41dp-3 {

list-style-type: none}ol.lst-kix_1wulu3ra2vwv-2.start {

counter-reset: lst-ctn-kix_1wulu3ra2vwv-2 0}.lst-kix_686a8e4qhxwx-6>li:before {

content: "\0025cf "}.lst-kix_s3mi7ukxwiwf-5>li {

counter-increment: lst-ctn-kix_s3mi7ukxwiwf-5}.lst-kix_h0kibz3smj6t-1>li:before {

content: "\0025cb "}.lst-kix_xv318blpjdo-6>li:before {

content: "(" counter(lst-ctn-kix_xv318blpjdo-6, lower-roman) ") "}ul.lst-kix_86hsx13ssqid-3 {

list-style-type: none}ul.lst-kix_86hsx13ssqid-2 {

list-style-type: none}.lst-kix_xv318blpjdo-3>li:before {

content: "" counter(lst-ctn-kix_xv318blpjdo-3, lower-latin) ") "}ul.lst-kix_86hsx13ssqid-5 {

list-style-type: none}ul.lst-kix_86hsx13ssqid-4 {

list-style-type: none}.lst-kix_686a8e4qhxwx-1>li:before {

content: "\0025cb "}ol.lst-kix_yly1729bcywk-2.start {

counter-reset: lst-ctn-kix_yly1729bcywk-2 0}ul.lst-kix_86hsx13ssqid-1 {

list-style-type: none}.lst-kix_jkgkf1u9sy0c-8>li:before {

content: "\0025a0 "}ul.lst-kix_86hsx13ssqid-0 {

list-style-type: none}ul.lst-kix_fy6y7gyjejoh-0 {

list-style-type: none}ul.lst-kix_fy6y7gyjejoh-1 {

list-style-type: none}ul.lst-kix_fy6y7gyjejoh-2 {

list-style-type: none}ul.lst-kix_fy6y7gyjejoh-3 {

list-style-type: none}.lst-kix_b7256qmdgo85-1>li:before {

content: "\0025cb "}ul.lst-kix_86hsx13ssqid-7 {

list-style-type: none}ul.lst-kix_h9mjmxara98n-0 {

list-style-type: none}ul.lst-kix_86hsx13ssqid-6 {

list-style-type: none}ul.lst-kix_86hsx13ssqid-8 {

list-style-type: none}ul.lst-kix_h9mjmxara98n-3 {

list-style-type: none}.lst-kix_4m04az9jmmj8-8>li:before {

content: "\0025a0 "}ul.lst-kix_fy6y7gyjejoh-8 {

list-style-type: none}ul.lst-kix_h9mjmxara98n-4 {

list-style-type: none}ul.lst-kix_h9mjmxara98n-1 {

list-style-type: none}ul.lst-kix_h9mjmxara98n-2 {

list-style-type: none}ul.lst-kix_h9mjmxara98n-7 {

list-style-type: none}ul.lst-kix_fy6y7gyjejoh-4 {

list-style-type: none}ul.lst-kix_h9mjmxara98n-8 {

list-style-type: none}ul.lst-kix_fy6y7gyjejoh-5 {

list-style-type: none}ul.lst-kix_h9mjmxara98n-5 {

list-style-type: none}ul.lst-kix_fy6y7gyjejoh-6 {

list-style-type: none}ul.lst-kix_h9mjmxara98n-6 {

list-style-type: none}ul.lst-kix_fy6y7gyjejoh-7 {

list-style-type: none}.lst-kix_b7256qmdgo85-6>li:before {

content: "\0025cf "}ol.lst-kix_yly1729bcywk-1.start {

counter-reset: lst-ctn-kix_yly1729bcywk-1 0}ol.lst-kix_1wulu3ra2vwv-1.start {

counter-reset: lst-ctn-kix_1wulu3ra2vwv-1 0}.lst-kix_ne7nl4nhpzqr-8>li {

counter-increment: lst-ctn-kix_ne7nl4nhpzqr-8}.lst-kix_q97rvvc7c69e-0>li:before {

content: "\0025cf "}.lst-kix_q8ok0mh9yyto-1>li:before {

content: "" counter(lst-ctn-kix_q8ok0mh9yyto-1, upper-latin) ". "}.lst-kix_4m04az9jmmj8-0>li:before {

content: "\0025cf "}ol.lst-kix_11a9ub9xa97v-6.start {

counter-reset: lst-ctn-kix_11a9ub9xa97v-6 0}.lst-kix_q8ok0mh9yyto-4>li:before {

content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-4, decimal) ") "}.lst-kix_emhp84jkv42c-0>li {

counter-increment: lst-ctn-kix_emhp84jkv42c-0}.lst-kix_q8ok0mh9yyto-5>li {

counter-increment: lst-ctn-kix_q8ok0mh9yyto-5}ul.lst-kix_lemcawe54w5c-7 {

list-style-type: none}ul.lst-kix_lemcawe54w5c-8 {

list-style-type: none}.lst-kix_ne7nl4nhpzqr-6>li:before {

content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-6, decimal) ". "}ul.lst-kix_lemcawe54w5c-5 {

list-style-type: none}ul.lst-kix_lemcawe54w5c-6 {

list-style-type: none}ul.lst-kix_lemcawe54w5c-3 {

list-style-type: none}ul.lst-kix_lemcawe54w5c-4 {

list-style-type: none}ul.lst-kix_lemcawe54w5c-1 {

list-style-type: none}ul.lst-kix_lemcawe54w5c-2 {

list-style-type: none}.lst-kix_s3mi7ukxwiwf-1>li {

counter-increment: lst-ctn-kix_s3mi7ukxwiwf-1}ul.lst-kix_lemcawe54w5c-0 {

list-style-type: none}.lst-kix_4m04az9jmmj8-3>li:before {

content: "\0025cf "}ul.lst-kix_f5kb4hocu5hh-4 {

list-style-type: none}ul.lst-kix_f5kb4hocu5hh-3 {

list-style-type: none}ul.lst-kix_f5kb4hocu5hh-6 {

list-style-type: none}ul.lst-kix_f5kb4hocu5hh-5 {

list-style-type: none}ul.lst-kix_f5kb4hocu5hh-8 {

list-style-type: none}ul.lst-kix_f5kb4hocu5hh-7 {

list-style-type: none}.lst-kix_xv318blpjdo-7>li {

counter-increment: lst-ctn-kix_xv318blpjdo-7}ol.lst-kix_xv318blpjdo-7.start {

counter-reset: lst-ctn-kix_xv318blpjdo-7 0}.lst-kix_gfromclascha-1>li:before {

content: "\0025cb "}.lst-kix_86hsx13ssqid-7>li:before {

content: "\0025cb "}.lst-kix_yly1729bcywk-0>li {

counter-increment: lst-ctn-kix_yly1729bcywk-0}.lst-kix_ne7nl4nhpzqr-3>li:before {

content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-3, decimal) ". "}ol.lst-kix_q8ok0mh9yyto-3.start {

counter-reset: lst-ctn-kix_q8ok0mh9yyto-3 0}.lst-kix_1wulu3ra2vwv-7>li {

counter-increment: lst-ctn-kix_1wulu3ra2vwv-7}ul.lst-kix_f5kb4hocu5hh-0 {

list-style-type: none}ul.lst-kix_f5kb4hocu5hh-2 {

list-style-type: none}ul.lst-kix_f5kb4hocu5hh-1 {

list-style-type: none}ul.lst-kix_fd1rucpc9vz2-0 {

list-style-type: none}.lst-kix_fy6y7gyjejoh-0>li:before {

content: "\0025cf "}ul.lst-kix_fd1rucpc9vz2-1 {

list-style-type: none}ul.lst-kix_fd1rucpc9vz2-2 {

list-style-type: none}.lst-kix_yly1729bcywk-1>li:before {

content: "" counter(lst-ctn-kix_yly1729bcywk-1, lower-latin) ". "}ul.lst-kix_fd1rucpc9vz2-3 {

list-style-type: none}ol.lst-kix_q8ok0mh9yyto-6.start {

counter-reset: lst-ctn-kix_q8ok0mh9yyto-6 0}ul.lst-kix_fd1rucpc9vz2-8 {

list-style-type: none}.lst-kix_pcjo479wrta-6>li:before {

content: "\0025cf "}.lst-kix_bfzyeb917dp8-6>li:before {

content: "(" counter(lst-ctn-kix_bfzyeb917dp8-6, lower-roman) ") "}.lst-kix_6ril5iwt0fcl-3>li:before {

content: "\0025cf "}ul.lst-kix_fd1rucpc9vz2-4 {

list-style-type: none}ul.lst-kix_fd1rucpc9vz2-5 {

list-style-type: none}ul.lst-kix_fd1rucpc9vz2-6 {

list-style-type: none}.lst-kix_fd1rucpc9vz2-6>li:before {

content: "\0025cf "}ul.lst-kix_fd1rucpc9vz2-7 {

list-style-type: none}.lst-kix_5anu1k9tsyak-4>li:before {

content: "\0025cb "}.lst-kix_vf0l197cqv6l-7>li {

counter-increment: lst-ctn-kix_vf0l197cqv6l-7}.lst-kix_s3mi7ukxwiwf-8>li {

counter-increment: lst-ctn-kix_s3mi7ukxwiwf-8}.lst-kix_iv2x96orjh4l-4>li:before {

content: "\0025cb "}.lst-kix_s3mi7ukxwiwf-6>li:before {

content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-6, decimal) ". "}.lst-kix_fy6y7gyjejoh-8>li:before {

content: "\0025a0 "}ol.lst-kix_xv318blpjdo-4.start {

counter-reset: lst-ctn-kix_xv318blpjdo-4 0}.lst-kix_x1epm4iu41dp-1>li:before {

content: "\0025cb "}.lst-kix_q97rvvc7c69e-8>li:before {

content: "\0025a0 "}ol.lst-kix_xv318blpjdo-5.start {

counter-reset: lst-ctn-kix_xv318blpjdo-5 0}ul.lst-kix_8p26nc4xx5n8-0 {

list-style-type: none}ul.lst-kix_8p26nc4xx5n8-1 {

list-style-type: none}ul.lst-kix_8p26nc4xx5n8-2 {

list-style-type: none}ul.lst-kix_8p26nc4xx5n8-3 {

list-style-type: none}ul.lst-kix_8p26nc4xx5n8-4 {

list-style-type: none}.lst-kix_emhp84jkv42c-0>li:before {

content: "" counter(lst-ctn-kix_emhp84jkv42c-0, upper-roman) ". "}.lst-kix_emhp84jkv42c-8>li:before {

content: "(" counter(lst-ctn-kix_emhp84jkv42c-8, lower-roman) ") "}.lst-kix_9jxnjym0nges-1>li:before {

content: "\0025cb "}.lst-kix_xoos54gyybzj-7>li:before {

content: "\0025cb "}ol.lst-kix_q8ok0mh9yyto-5.start {

counter-reset: lst-ctn-kix_q8ok0mh9yyto-5 0}.lst-kix_ndaonzmgp8vn-3>li:before {

content: "\0025cf "}.lst-kix_jj5w63toozfm-8>li:before {

content: "" counter(lst-ctn-kix_jj5w63toozfm-8, lower-roman) ". "}.lst-kix_u0uqs69v9qbh-1>li:before {

content: "\0025cb "}.lst-kix_opi66v2qdsjs-1>li:before {

content: "\0025cb "}.lst-kix_lemcawe54w5c-1>li:before {

content: "\0025cb "}.lst-kix_11a9ub9xa97v-7>li:before {

content: "(" counter(lst-ctn-kix_11a9ub9xa97v-7, lower-latin) ") "}.lst-kix_8p26nc4xx5n8-5>li:before {

content: "\0025a0 "}ol.lst-kix_xv318blpjdo-6.start {

counter-reset: lst-ctn-kix_xv318blpjdo-6 0}.lst-kix_l7z426mwssm0-7>li:before {

content: "\0025cb "}.lst-kix_1wulu3ra2vwv-0>li {

counter-increment: lst-ctn-kix_1wulu3ra2vwv-0}.lst-kix_gyhqddkw9i05-5>li:before {

content: "\0025a0 "}.lst-kix_hchtl271h88l-2>li:before {

content: "\0025a0 "}ul.lst-kix_6qnkx7t1adn9-8 {

list-style-type: none}ol.lst-kix_q8ok0mh9yyto-4.start {

counter-reset: lst-ctn-kix_q8ok0mh9yyto-4 0}ul.lst-kix_6qnkx7t1adn9-7 {

list-style-type: none}ul.lst-kix_8p26nc4xx5n8-5 {

list-style-type: none}ul.lst-kix_6qnkx7t1adn9-6 {

list-style-type: none}ul.lst-kix_8p26nc4xx5n8-6 {

list-style-type: none}ul.lst-kix_6qnkx7t1adn9-5 {

list-style-type: none}.lst-kix_sholqrhc62dh-3>li:before {

content: "\0025cf "}ul.lst-kix_8p26nc4xx5n8-7 {

list-style-type: none}ul.lst-kix_6qnkx7t1adn9-4 {

list-style-type: none}ul.lst-kix_8p26nc4xx5n8-8 {

list-style-type: none}ul.lst-kix_6qnkx7t1adn9-3 {

list-style-type: none}ul.lst-kix_6qnkx7t1adn9-2 {

list-style-type: none}ul.lst-kix_6qnkx7t1adn9-1 {

list-style-type: none}.lst-kix_1wulu3ra2vwv-1>li:before {

content: "" counter(lst-ctn-kix_1wulu3ra2vwv-1, upper-latin) ". "}ul.lst-kix_6qnkx7t1adn9-0 {

list-style-type: none}ol {

margin: 0;

padding: 0}table td, table th {

padding: 0}.c4 {

color: #ff5e0e;

font-weight: 700;

text-decoration: none;

vertical-align: baseline;

font-size: 18pt;

font-family: "PT Sans Narrow";

font-style: normal}.c7 {

color: #38761d;

font-weight: 400;

text-decoration: none;

vertical-align: baseline;

font-size: 16pt;

font-family: "PT Sans Narrow";

font-style: normal}.c14 {

color: #695d46;

font-weight: 700;

text-decoration: none;

vertical-align: baseline;

font-size: 42pt;

font-family: "PT Sans Narrow";

font-style: normal}.c0 {

color: #695d46;

font-weight: 400;

text-decoration: none;

vertical-align: baseline;

font-size: 11pt;

font-family: "Open Sans";

font-style: normal}.c1 {

padding-top: 6pt;

padding-bottom: 0pt;

line-height: 1.2;

orphans: 2;

widows: 2;

text-align: left}.c8 {

padding-top: 18pt;

padding-bottom: 6pt;

line-height: 1.2;

page-break-after: avoid;

text-align: left}.c11 {

padding-top: 24pt;

padding-bottom: 0pt;

line-height: 1.3;

page-break-after: avoid;

text-align: left}.c17 {

padding-top: 6pt;

padding-bottom: 0pt;

line-height: 1.2;

page-break-after: avoid;

text-align: left}.c19 {

text-decoration: none;

vertical-align: baseline;

font-size: 12pt;

font-style: normal}.c9 {

padding-top: 16pt;

padding-bottom: 0pt;

line-height: 1.0;

text-align: left}.c18 {

padding-top: 0pt;

padding-bottom: 0pt;

line-height: 1.2;

text-align: left}.c10 {

font-size: 18pt;

font-family: "PT Sans Narrow";

color: #ff5e0e;

font-weight: 700}.c13 {

font-family: "Open Sans";

color: #695d46;

font-weight: 400}.c12 {

background-color: #ffffff;

max-width: 468pt;

padding: 72pt 72pt 72pt 72pt}.c5 {

padding: 0;

margin: 0}.c15 {

color: inherit;

text-decoration: inherit}.c16 {

color: #1155cc;

text-decoration: underline}.c3 {

padding-left: 0pt}.c6 {

margin-left: 72pt}.c2 {

margin-left: 36pt}.title {

padding-top: 0pt;

color: #695d46;

font-size: 26pt;

padding-bottom: 3pt;

font-family: "Open Sans";

line-height: 1.2;

page-break-after: avoid;

orphans: 2;

widows: 2;

text-align: left}.subtitle {

padding-top: 0pt;

color: #666666;

font-size: 15pt;

padding-bottom: 16pt;

font-family: "Arial";

line-height: 1.2;

page-break-after: avoid;

orphans: 2;

widows: 2;

text-align: left}li {

color: #695d46;

font-size: 11pt;

font-family: "Open Sans"}p {

margin: 0;

color: #695d46;

font-size: 11pt;

font-family: "Open Sans"}h1 {

padding-top: 24pt;

color: #ff5e0e;

font-weight: 700;

font-size: 18pt;

padding-bottom: 0pt;

font-family: "PT Sans Narrow";

line-height: 1.3;

page-break-after: avoid;

orphans: 2;

widows: 2;

text-align: left}h2 {

padding-top: 18pt;

color: #38761d;

font-size: 16pt;

padding-bottom: 6pt;

font-family: "PT Sans Narrow";

line-height: 1.2;

page-break-after: avoid;

orphans: 2;

widows: 2;

text-align: left}h3 {

padding-top: 16pt;

color: #434343;

font-size: 14pt;

padding-bottom: 4pt;

font-family: "Open Sans";

line-height: 1.2;

page-break-after: avoid;

orphans: 2;

widows: 2;

text-align: left}h4 {

padding-top: 14pt;

color: #666666;

font-size: 12pt;

padding-bottom: 4pt;

font-family: "Open Sans";

line-height: 1.2;

page-break-after: avoid;

orphans: 2;

widows: 2;

text-align: left}h5 {

padding-top: 12pt;

color: #666666;

font-size: 11pt;

padding-bottom: 4pt;

font-family: "Open Sans";

line-height: 1.2;

page-break-after: avoid;

orphans: 2;

widows: 2;

text-align: left}h6 {

padding-top: 12pt;

color: #666666;

font-size: 11pt;

padding-bottom: 4pt;

font-family: "Open Sans";

line-height: 1.2;

page-break-after: avoid;

font-style: italic;

orphans: 2;

widows: 2;

text-align: left}

 

Oracle Fusion Middleware Deployments Using

Docker Swarm Part III

Overview

This is the third in a series of blogs that

describe how to build a Fusion Middleware (FMW) Cluster that runs as

a number of Docker images that run in docker containers.  These

containers are coordinated using Docker Swarm and can be deployed to

a single host machine or multiple hosts.  This simplifies the

task of building FMW clusters and also makes it easier to scale them

in and out (adding or subtracting host machines) as well as up and

down (using bigger or smaller host
machines).  Using docker also helps us to avoid port

conflicts when running multiple servers on the same

physical machine.  When we use swarm we will see that we also

get benefits from a built in load balancer.

This blog uses Oracle Service Bus as an FMW

product but the principles are applicable to other FMW products.

In our previous blog we talked about how to

build the required docker images for running FMW on Docker Swarm and

created a database container.

In this entry we will explain how to create

an FMW domain image and how to run that in a docker container
.  The next blog will cover how to run this in

Docker Swarm.

Key Steps in Creating a Service Bus Cluster

When creating a service bus cluster we need to

do the following:

  1. Create the required

    schemas in a database.

  • Service Bus 12.1

    adds a number of new features such as re-sequencing that require the

    use of SOA Suite schemas.  These are in addition to the

    database requirements for Web Services Security Manager that existed

    in Service Bus 11g.
  • The Repository

    Creation Utility is used to create the schemas in a database.

  1. Create service bus

    domain.

  • The service bus

    domain contains all the required service bus binaries and associated

    configuration.  Within the domain we will create a service bus

    cluster.
  • The domain can be

    created using the WebLogic scripting tool by applying the service

    bus domain template.

  1. Create a Service Bus

    cluster within the domain.

  • The service bus

    cluster allows us to have multiple service bus servers running the

    same proxy services and sharing the load.
  • The cluster can be

    created and servers assigned using the WebLogic scripting tool.

These steps need to be factored into the way

we build our docker images and containers and ultimately into how we

create Docker Swarm services.

Mapping the Service Bus Cluster onto Docker

There are a number of ways in which we could

map a Service Bus cluster onto Docker.  We have chosen the

following approach:

  • Create a Docker

    image that contains the Service Bus domain configuration.

  • This is layered on

    top of the OSB installation image.  This allows us to modify

    and rebuild the scripts without having to reinstall the FMW

    software.  This speeds up the development cycle of the image.

     Once the scripts are working they could be placed in the FMW

    binary image, reducing the number of layers.
  • When creating a

    container from the image we run the RCU to create the schemas in the

    database.  We also run scripts to create the domain and add

    servers to the domain as needed.

  • The same Docker

    image is used for both Admin and Managed Servers.

  • Depending on

    parameters the container decides if it is an admin server or a

    member of a cluster.
  • All servers need

    access to the database.
  • All servers need

    access to the Admin server.
  • The admin server

    requires access to all servers.

Container Summary

We effectively have two images, which are both

built from multiple layers as explained previously.

  1. Database image holds

    the binaries for database and scripts to create a database instance.
  2. Fusion Middleware

    image holds the FMW binaries and scripts to create a domain, or

    extend an existing domain.

We have a single Docker Container to run the

database from the database image.

We have multiple Docker Containers, one per managed server, to run Fusion Middleware from the single domain

image.

To simplify starting the containers the git

project includes run scripts (run.sh for database and runNode.sh for

FMW) that can be used to create containers.

Database Container

The database container runs from the database

image and has the following characteristics:

  • When the container is created

    it creates and starts a database
    instance.
  • After starting the

    database we change the database password.
  • When the container

    is stopped it shuts down the database instance.
  • When the container

    is started it starts the database instance.
  • The database

    container exposes the database port (1521 in this case)
  • Only a single

    container runs a given database.

The database container is started using the

following command:

docker run -d -it --name Oracle12cDB

--hostname osbdb -p 1521:1521 -p 5500:5500 -e ORACLE_SID=ORCL -e

ORACLE_PDB=OSB -v /opt/oracle/oradata/OracleDB

oracle/database:12.1.0.2-ee

We expose ports 1521 (database) and 5500 (em).

Admin Server Container

The admin server container runs from the FMW

domain image, or just the FMW image if the layers have been

collapsed.  It has the following characteristics:

  • When the container

    is created it runs the RCU to configure the database.
  • When the container is created

    it creates an FMW
    domain and

    cluster.
  • When the container

    is created it starts the Admin Server.
  • When the container

    is stopped its stops the Admin Server.
  • When the container

    is started it starts the Admin Server.
  • The Admin Server

    exposes the admin console port (7001 in this case)
  • Only a single Admin

    Server container runs in a given domain.
  • The same image is

    used for both Admin and Managed Servers.

We start the admin server using the following

command

runNode.sh admin

This translates to

docker run -d -it \

        -e

"MS_NAME=AdminServer" \

        -e

"MACHINE_NAME=AdminServerMachine" \

        --name

wlsadmin \

        --add-host

osbdb:172.17.0.2 \

        --add-host

wlsadmin:172.17.0.3 \

        --add-host

wls1:172.17.0.4 \

        --add-host

wls2:172.17.0.5 \

        --add-host

wls3:172.17.0.6 \

        --add-host

wls4:172.17.0.7 \

        --hostname

wlsadmin \

        -p

7001:7001 \

        oracle/osb_domain:12.2.1.2

\

        /u01/oracle/container-scripts/createAndStartOSBDomain.sh

We need to add the hostnames of the managed

servers and the database to the /etc/hosts file so that the admin

server can access them.  We will show how to avoid doing this in

the final blog post.

Managed Server Containers

The managed server containers runs from the

same FMW domain image as the Admin Server.  It has the following

characteristics:

  • When the container

    is created it creates a new server in the domain and adds it to the

    FMW cluster
  • When the container is created

    it creates
     a local copy of the domain files.
  • When the container

    is created it starts the Managed Server.
  • When the container

    is stopped its stops the Managed Server.
  • When the container

    is started it starts the Managed Server.
  • The Managed Server

    exposes the admin console port (8011 in this case)
  • Multiple Managed

    Server containers may run in a given domain.
  • The same image is

    used for both Admin and Managed Servers.

We start the managed servers using the

following command

runNode.sh N

Where N is the number of the managed server.

When N=2 this  translates to

docker run -d -it \

        -e

"MS_NAME=osb_server2" \

        -e

"MACHINE_NAME=OsbServer2Machine" \

        --name

wls2 \

        --add-host

osbdb:172.17.0.2 \

        --add-host

wlsadmin:172.17.0.3 \

        --add-host

wls1:172.17.0.4 \

        --add-host

wls2:172.17.0.5 \

        --add-host

wls3:172.17.0.6 \

        --add-host

wls4:172.17.0.7 \

        --hostname

wlsadmin \

        -p

8013:8011 \

        oracle/osb_domain:12.2.1.2

\

        /u01/oracle/container-scripts/createAndStartOSBDomain.sh

Note that all the managed servers listen on

port 8011.  Because they each run in their own container their

is no conflict in their port numbers but we need to map them so that

they can be accessed externally without conflicts.

Special Notes for Service Bus

The first managed server in a Service Bus

cluster is special because it runs singleton tasks related to

reporting, collecting performance information from other nodes in the

cluster and aggregating it and making it available to the console.

 Because of this we decided to always create a Service Bus

domain with a pre-existing single Managed Server in the cluster with

the correct singleton targeting.

Because this server already exists if a

container detects it is supposed to run Managed Server 1 then it does

not create the server or associate it with a cluster, it justs

assigns it to a machine (see next section for details) and creates

the local managed server domain.

Containers and FMW Mapping

Each container maps to a single WebLogic

server, either Admin Server or a Managed Server in a cluster.

The Admin Server container is responsible for

running the repository configuration utility, creating the domain and

configuring it for that particular FMW product (in our case Service

Bus).

The Managed Server containers are responsible

for adding a new Managed Server to the cluster and creating a local

managed server domain.

Both Admin and Managed Server containers need

to figure out key facts about themselves:

  • Hostname - used to

    set the listen address for the server and also the address of the

    machine
  • Type - admin or

    managed server to decide what to do on creation
  • Server identifier -

    managed servers need to make sure they have unique server names.
  • Associated Admin

    Server - managed servers must contact the admin server to obtain and

    update domain configuration.
  • Database Server -

    admin servers must know about the database to be able to run the RCU

    and create data sources required by the FMW product.

Starting the FMW Cluster

The FMW cluster is started as follows:

  1. A database container

    is created/started
  2. An admin server is

    created/started
  3. One or more managed

    servers are created/started

Containers are created using the “docker

run” command.  We use the “-d” flag to run

them as daemon processes.  By default the CMD directive in the

dockerfile is used choose the command or script to run on container

startup.  We use this for the database container.  For the

admin and managed containers we identify which type of container they

are and pass in an appropriate script to the “docker run”

command.

Containers are started using the “docker

start” command and the container uses the same command or

script as when it was created.  That means we must detect if

this is a new container or a container being started after previously

being shutdown.  With the FMW containers we do this by looking

for the existence of the domain directory, if it exists we have

previously been started, if not this must be our first run.

Tools such as docker compose and docker

compose simplify the task of deploying our multiple container FMW

cluster and we will look at these in the next blog entry.  One

of the benefits we will find with swarm is that it includes a load

balancer.  The current multi-container approach would require

either another container to run a load balancer or an external load

balancer, we will see that swarm removes this need.

Retrieving Docker Files for OSB Cluster

We are posting all the required

files to go along with this blog on github
.  You

are welcome to fork from this and improve it.  We cloned many of

these files from the
official

Oracle docker github
.  We removed unused versions

and added a simplified build.sh file to each product directory to

make it easy to see how we actually built our environment.  We

are still updating the files online and will shortly add details on

building the swarm services.

Summary

In this entry we have explained how to create

a Fusion Middleware Domain
and run it on docker

containers
.  In our next entry we will

simplify the deployment
of of our cluster

by taking advatage of swarm

mode by defining swarm services for the database, WebLogic Admin

Server and WebLogic managed servers.

Building an FMW Cluster using Docker (Part III Running Docker Containers)

Mon, 2017-03-13 01:02

Click here for a Google Docs version of this document that doesn't suffer from the Oracle blog formatting problems

@import url('https://themes.googleusercontent.com/fonts/css?kit=soJ-z33zIWP9ip4SlSLqmawpPKmPqgwAG3potzd-b6hLxa5kJlTvGyssufwSrkOWWWXuzMD-CMEVHDC2H45HXw') ; .lst-kix_sholqrhc62dh-7>li:before { content: "\0025cb " } .lst-kix_sholqrhc62dh-8>li:before { content: "\0025a0 " } .lst-kix_sholqrhc62dh-6>li:before { content: "\0025cf " } ol.lst-kix_vf0l197cqv6l-2.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-2 0 } ol.lst-kix_xv318blpjdo-3.start { counter-reset: lst-ctn-kix_xv318blpjdo-3 0 } .lst-kix_sholqrhc62dh-1>li:before { content: "\0025cb " } .lst-kix_vf0l197cqv6l-2>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-2, lower-roman) ". " } .lst-kix_sholqrhc62dh-0>li:before { content: "\0025cf " } .lst-kix_emhp84jkv42c-3>li { counter-increment: lst-ctn-kix_emhp84jkv42c-3 } .lst-kix_ekmayt81kvbz-0>li:before { content: "\0025cf " } .lst-kix_vf0l197cqv6l-1>li:before { content: "\0025cb " } .lst-kix_jj5w63toozfm-4>li { counter-increment: lst-ctn-kix_jj5w63toozfm-4 } .lst-kix_ekmayt81kvbz-2>li:before { content: "\0025a0 " } ul.lst-kix_qeqyxe7gm97l-6 { list-style-type: none } ul.lst-kix_qeqyxe7gm97l-5 { list-style-type: none } .lst-kix_ekmayt81kvbz-1>li:before { content: "\0025cb " } ul.lst-kix_qeqyxe7gm97l-4 { list-style-type: none } .lst-kix_ekmayt81kvbz-3>li:before { content: "\0025cf " } ul.lst-kix_qeqyxe7gm97l-3 { list-style-type: none } .lst-kix_vf0l197cqv6l-0>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-0, decimal) ". " } ul.lst-kix_qeqyxe7gm97l-2 { list-style-type: none } ul.lst-kix_qeqyxe7gm97l-1 { list-style-type: none } ul.lst-kix_qeqyxe7gm97l-0 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-8.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-8 0 } .lst-kix_ekmayt81kvbz-5>li:before { content: "\0025a0 " } .lst-kix_ekmayt81kvbz-7>li:before { content: "\0025cb " } ul.lst-kix_4m04az9jmmj8-3 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-2 { list-style-type: none } ul.lst-kix_qeqyxe7gm97l-8 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-1 { list-style-type: none } .lst-kix_ekmayt81kvbz-4>li:before { content: "\0025cb " } .lst-kix_ekmayt81kvbz-8>li:before { content: "\0025a0 " } ul.lst-kix_qeqyxe7gm97l-7 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-0 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-7 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-6 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-5 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-4 { list-style-type: none } .lst-kix_ekmayt81kvbz-6>li:before { content: "\0025cf " } ul.lst-kix_4m04az9jmmj8-8 { list-style-type: none } .lst-kix_s3mi7ukxwiwf-2>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-2 } .lst-kix_11a9ub9xa97v-0>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-0 } ol.lst-kix_emhp84jkv42c-4.start { counter-reset: lst-ctn-kix_emhp84jkv42c-4 0 } ol.lst-kix_xv318blpjdo-8.start { counter-reset: lst-ctn-kix_xv318blpjdo-8 0 } ul.lst-kix_6ril5iwt0fcl-5 { list-style-type: none } .lst-kix_q8ok0mh9yyto-8>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-8 } ul.lst-kix_6ril5iwt0fcl-4 { list-style-type: none } ul.lst-kix_6ril5iwt0fcl-3 { list-style-type: none } ul.lst-kix_6ril5iwt0fcl-2 { list-style-type: none } ul.lst-kix_6ril5iwt0fcl-8 { list-style-type: none } ul.lst-kix_6ril5iwt0fcl-7 { list-style-type: none } ul.lst-kix_6ril5iwt0fcl-6 { list-style-type: none } .lst-kix_vf0l197cqv6l-6>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-6 } .lst-kix_vf0l197cqv6l-4>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-4, lower-latin) ". " } ol.lst-kix_s3mi7ukxwiwf-8.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-8 0 } .lst-kix_vf0l197cqv6l-3>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-3, decimal) ". " } .lst-kix_vf0l197cqv6l-5>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-5, lower-roman) ". " } .lst-kix_vf0l197cqv6l-6>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-6, decimal) ". " } ul.lst-kix_6ril5iwt0fcl-1 { list-style-type: none } .lst-kix_vf0l197cqv6l-8>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-8, lower-roman) ". " } ul.lst-kix_6ril5iwt0fcl-0 { list-style-type: none } .lst-kix_xv318blpjdo-1>li { counter-increment: lst-ctn-kix_xv318blpjdo-1 } .lst-kix_vf0l197cqv6l-7>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-7, lower-latin) ". " } .lst-kix_bfzyeb917dp8-6>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-6 } ol.lst-kix_yly1729bcywk-0 { list-style-type: none } ol.lst-kix_yly1729bcywk-1 { list-style-type: none } ol.lst-kix_yly1729bcywk-6.start { counter-reset: lst-ctn-kix_yly1729bcywk-6 0 } ol.lst-kix_yly1729bcywk-4 { list-style-type: none } ol.lst-kix_yly1729bcywk-5 { list-style-type: none } ol.lst-kix_yly1729bcywk-2 { list-style-type: none } ol.lst-kix_yly1729bcywk-3 { list-style-type: none } .lst-kix_s3mi7ukxwiwf-1>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-1, lower-latin) ". " } ol.lst-kix_yly1729bcywk-8 { list-style-type: none } ul.lst-kix_hchtl271h88l-3 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-0.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-0 0 } ul.lst-kix_hchtl271h88l-2 { list-style-type: none } ol.lst-kix_yly1729bcywk-6 { list-style-type: none } ul.lst-kix_hchtl271h88l-5 { list-style-type: none } ol.lst-kix_yly1729bcywk-7 { list-style-type: none } ul.lst-kix_hchtl271h88l-4 { list-style-type: none } .lst-kix_gfromclascha-0>li:before { content: "\0025cf " } ul.lst-kix_hchtl271h88l-1 { list-style-type: none } ul.lst-kix_hchtl271h88l-0 { list-style-type: none } .lst-kix_gfromclascha-2>li:before { content: "\0025a0 " } .lst-kix_gfromclascha-4>li:before { content: "\0025cb " } ul.lst-kix_hchtl271h88l-7 { list-style-type: none } ul.lst-kix_hchtl271h88l-6 { list-style-type: none } ul.lst-kix_hchtl271h88l-8 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-7.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-7 0 } .lst-kix_6ril5iwt0fcl-0>li:before { content: "\0025cf " } .lst-kix_gfromclascha-6>li:before { content: "\0025cf " } .lst-kix_q97rvvc7c69e-5>li:before { content: "\0025a0 " } .lst-kix_q97rvvc7c69e-7>li:before { content: "\0025cb " } ol.lst-kix_q8ok0mh9yyto-8.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-8 0 } .lst-kix_6ril5iwt0fcl-2>li:before { content: "\0025a0 " } .lst-kix_q97rvvc7c69e-3>li:before { content: "\0025cf " } .lst-kix_s3mi7ukxwiwf-7>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-7, lower-latin) ". " } .lst-kix_6ril5iwt0fcl-4>li:before { content: "\0025cb " } .lst-kix_6ril5iwt0fcl-6>li:before { content: "\0025cf " } .lst-kix_xv318blpjdo-8>li { counter-increment: lst-ctn-kix_xv318blpjdo-8 } .lst-kix_s3mi7ukxwiwf-5>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-5, lower-roman) ". " } .lst-kix_6ril5iwt0fcl-8>li:before { content: "\0025a0 " } .lst-kix_s3mi7ukxwiwf-3>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-3, decimal) ". " } .lst-kix_ne7nl4nhpzqr-0>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-0 } .lst-kix_ne7nl4nhpzqr-7>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-7 } .lst-kix_vf0l197cqv6l-5>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-5 } ol.lst-kix_jj5w63toozfm-7.start { counter-reset: lst-ctn-kix_jj5w63toozfm-7 0 } .lst-kix_1wulu3ra2vwv-4>li:before { content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-4, decimal) ") " } .lst-kix_yly1729bcywk-3>li { counter-increment: lst-ctn-kix_yly1729bcywk-3 } .lst-kix_hchtl271h88l-5>li:before { content: "\0025a0 " } .lst-kix_1wulu3ra2vwv-6>li:before { content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-6, lower-roman) ") " } .lst-kix_yly1729bcywk-4>li { counter-increment: lst-ctn-kix_yly1729bcywk-4 } .lst-kix_hchtl271h88l-7>li:before { content: "\0025cb " } .lst-kix_1wulu3ra2vwv-8>li:before { content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-8, lower-roman) ") " } .lst-kix_gfromclascha-8>li:before { content: "\0025a0 " } .lst-kix_hchtl271h88l-3>li:before { content: "\0025cf " } .lst-kix_sholqrhc62dh-2>li:before { content: "\0025a0 " } ul.lst-kix_9jxnjym0nges-0 { list-style-type: none } .lst-kix_hchtl271h88l-1>li:before { content: "\0025cb " } .lst-kix_sholqrhc62dh-4>li:before { content: "\0025cb " } .lst-kix_1wulu3ra2vwv-2>li:before { content: "" counter(lst-ctn-kix_1wulu3ra2vwv-2, decimal) ". " } .lst-kix_1wulu3ra2vwv-0>li:before { content: "" counter(lst-ctn-kix_1wulu3ra2vwv-0, upper-roman) ". " } ol.lst-kix_11a9ub9xa97v-3.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-3 0 } .lst-kix_emhp84jkv42c-2>li { counter-increment: lst-ctn-kix_emhp84jkv42c-2 } ol.lst-kix_s3mi7ukxwiwf-4.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-4 0 } ul.lst-kix_h0kibz3smj6t-8 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-7.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-7 0 } .lst-kix_jkgkf1u9sy0c-2>li:before { content: "\0025a0 " } .lst-kix_f5kb4hocu5hh-2>li:before { content: "\0025a0 " } .lst-kix_jkgkf1u9sy0c-1>li:before { content: "\0025cb " } .lst-kix_f5kb4hocu5hh-6>li:before { content: "\0025cf " } ul.lst-kix_iv2x96orjh4l-2 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-1.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-1 0 } ul.lst-kix_iv2x96orjh4l-3 { list-style-type: none } .lst-kix_f5kb4hocu5hh-5>li:before { content: "\0025a0 " } ul.lst-kix_iv2x96orjh4l-0 { list-style-type: none } .lst-kix_jj5w63toozfm-3>li { counter-increment: lst-ctn-kix_jj5w63toozfm-3 } ul.lst-kix_iv2x96orjh4l-1 { list-style-type: none } ul.lst-kix_iv2x96orjh4l-6 { list-style-type: none } ul.lst-kix_iv2x96orjh4l-7 { list-style-type: none } .lst-kix_ne7nl4nhpzqr-6>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-6 } ul.lst-kix_iv2x96orjh4l-4 { list-style-type: none } ul.lst-kix_iv2x96orjh4l-5 { list-style-type: none } ul.lst-kix_h0kibz3smj6t-3 { list-style-type: none } ul.lst-kix_h0kibz3smj6t-2 { list-style-type: none } ul.lst-kix_h0kibz3smj6t-1 { list-style-type: none } .lst-kix_jkgkf1u9sy0c-5>li:before { content: "\0025a0 " } ul.lst-kix_h0kibz3smj6t-0 { list-style-type: none } ol.lst-kix_jj5w63toozfm-2.start { counter-reset: lst-ctn-kix_jj5w63toozfm-2 0 } ul.lst-kix_h0kibz3smj6t-7 { list-style-type: none } ul.lst-kix_h0kibz3smj6t-6 { list-style-type: none } ul.lst-kix_h0kibz3smj6t-5 { list-style-type: none } .lst-kix_jkgkf1u9sy0c-6>li:before { content: "\0025cf " } ul.lst-kix_h0kibz3smj6t-4 { list-style-type: none } .lst-kix_emhp84jkv42c-4>li { counter-increment: lst-ctn-kix_emhp84jkv42c-4 } ul.lst-kix_iv2x96orjh4l-8 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-3.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-3 0 } .lst-kix_b7256qmdgo85-3>li:before { content: "\0025cf " } .lst-kix_b7256qmdgo85-4>li:before { content: "\0025cb " } .lst-kix_b7256qmdgo85-7>li:before { content: "\0025cb " } ol.lst-kix_jj5w63toozfm-3.start { counter-reset: lst-ctn-kix_jj5w63toozfm-3 0 } .lst-kix_q97rvvc7c69e-2>li:before { content: "\0025a0 " } .lst-kix_b7256qmdgo85-8>li:before { content: "\0025a0 " } ol.lst-kix_bfzyeb917dp8-2.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-2 0 } ol.lst-kix_1wulu3ra2vwv-6.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-6 0 } ol.lst-kix_yly1729bcywk-7.start { counter-reset: lst-ctn-kix_yly1729bcywk-7 0 } .lst-kix_jj5w63toozfm-5>li { counter-increment: lst-ctn-kix_jj5w63toozfm-5 } .lst-kix_s3mi7ukxwiwf-0>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-0, decimal) ". " } ul.lst-kix_q97rvvc7c69e-4 { list-style-type: none } ul.lst-kix_q97rvvc7c69e-3 { list-style-type: none } ul.lst-kix_q97rvvc7c69e-6 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-6.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-6 0 } .lst-kix_s3mi7ukxwiwf-8>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-8, lower-roman) ". " } ul.lst-kix_q97rvvc7c69e-5 { list-style-type: none } ul.lst-kix_q97rvvc7c69e-8 { list-style-type: none } ul.lst-kix_q97rvvc7c69e-7 { list-style-type: none } .lst-kix_gfromclascha-3>li:before { content: "\0025cf " } ul.lst-kix_q97rvvc7c69e-0 { list-style-type: none } ul.lst-kix_q97rvvc7c69e-2 { list-style-type: none } ul.lst-kix_q97rvvc7c69e-1 { list-style-type: none } .lst-kix_yly1729bcywk-3>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-3, decimal) ". " } .lst-kix_q97rvvc7c69e-6>li:before { content: "\0025cf " } .lst-kix_6ril5iwt0fcl-1>li:before { content: "\0025cb " } .lst-kix_iv2x96orjh4l-6>li:before { content: "\0025cf " } .lst-kix_yly1729bcywk-7>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-7, lower-latin) ". " } ol.lst-kix_s3mi7ukxwiwf-3.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-3 0 } .lst-kix_6ril5iwt0fcl-5>li:before { content: "\0025a0 " } .lst-kix_iv2x96orjh4l-2>li:before { content: "\0025a0 " } .lst-kix_q8ok0mh9yyto-1>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-1 } .lst-kix_s3mi7ukxwiwf-4>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-4, lower-latin) ". " } .lst-kix_5anu1k9tsyak-2>li:before { content: "\0025a0 " } .lst-kix_b7256qmdgo85-0>li:before { content: "\0025cf " } ul.lst-kix_vf0l197cqv6l-1 { list-style-type: none } .lst-kix_1wulu3ra2vwv-3>li:before { content: "" counter(lst-ctn-kix_1wulu3ra2vwv-3, lower-latin) ") " } .lst-kix_xoos54gyybzj-5>li:before { content: "\0025a0 " } ol.lst-kix_ne7nl4nhpzqr-5.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-5 0 } ol.lst-kix_vf0l197cqv6l-7.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-7 0 } .lst-kix_11a9ub9xa97v-7>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-7 } .lst-kix_1wulu3ra2vwv-7>li:before { content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-7, lower-latin) ") " } .lst-kix_xoos54gyybzj-1>li:before { content: "\0025cb " } ol.lst-kix_ne7nl4nhpzqr-2 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-3 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-0 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-1 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-6 { list-style-type: none } .lst-kix_hchtl271h88l-8>li:before { content: "\0025a0 " } ol.lst-kix_ne7nl4nhpzqr-7 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-4 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-5 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-8 { list-style-type: none } .lst-kix_1wulu3ra2vwv-6>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-6 } .lst-kix_gfromclascha-7>li:before { content: "\0025cb " } ol.lst-kix_ne7nl4nhpzqr-6.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-6 0 } ul.lst-kix_pcjo479wrta-0 { list-style-type: none } .lst-kix_86hsx13ssqid-5>li:before { content: "\0025a0 " } ul.lst-kix_pcjo479wrta-2 { list-style-type: none } ul.lst-kix_pcjo479wrta-1 { list-style-type: none } ul.lst-kix_pcjo479wrta-4 { list-style-type: none } .lst-kix_hchtl271h88l-4>li:before { content: "\0025cb " } ul.lst-kix_pcjo479wrta-3 { list-style-type: none } ul.lst-kix_pcjo479wrta-6 { list-style-type: none } ul.lst-kix_pcjo479wrta-5 { list-style-type: none } ul.lst-kix_pcjo479wrta-8 { list-style-type: none } ul.lst-kix_pcjo479wrta-7 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-8.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-8 0 } .lst-kix_hchtl271h88l-0>li:before { content: "\0025cf " } .lst-kix_86hsx13ssqid-1>li:before { content: "\0025cb " } .lst-kix_sholqrhc62dh-5>li:before { content: "\0025a0 " } .lst-kix_7tib3jrzu2u9-0>li:before { content: "\0025cf " } .lst-kix_7tib3jrzu2u9-5>li:before { content: "\0025a0 " } .lst-kix_7tib3jrzu2u9-2>li:before { content: "\0025a0 " } .lst-kix_7tib3jrzu2u9-3>li:before { content: "\0025cf " } ul.lst-kix_ndaonzmgp8vn-4 { list-style-type: none } ul.lst-kix_ndaonzmgp8vn-3 { list-style-type: none } ul.lst-kix_ndaonzmgp8vn-6 { list-style-type: none } ul.lst-kix_ndaonzmgp8vn-5 { list-style-type: none } ul.lst-kix_ndaonzmgp8vn-0 { list-style-type: none } ul.lst-kix_ndaonzmgp8vn-2 { list-style-type: none } .lst-kix_bfzyeb917dp8-4>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-4 } ul.lst-kix_ndaonzmgp8vn-1 { list-style-type: none } .lst-kix_7tib3jrzu2u9-8>li:before { content: "\0025a0 " } ul.lst-kix_sholqrhc62dh-6 { list-style-type: none } ul.lst-kix_sholqrhc62dh-5 { list-style-type: none } ul.lst-kix_sholqrhc62dh-4 { list-style-type: none } ul.lst-kix_sholqrhc62dh-3 { list-style-type: none } ul.lst-kix_sholqrhc62dh-8 { list-style-type: none } ul.lst-kix_sholqrhc62dh-7 { list-style-type: none } ul.lst-kix_sholqrhc62dh-2 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-6.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-6 0 } ul.lst-kix_sholqrhc62dh-1 { list-style-type: none } ul.lst-kix_sholqrhc62dh-0 { list-style-type: none } .lst-kix_emhp84jkv42c-1>li { counter-increment: lst-ctn-kix_emhp84jkv42c-1 } ul.lst-kix_ndaonzmgp8vn-8 { list-style-type: none } ul.lst-kix_ndaonzmgp8vn-7 { list-style-type: none } .lst-kix_j42a5dwgnqyq-8>li:before { content: "\0025a0 " } .lst-kix_5anu1k9tsyak-6>li:before { content: "\0025cf " } ol.lst-kix_bfzyeb917dp8-1.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-1 0 } .lst-kix_j42a5dwgnqyq-7>li:before { content: "\0025cb " } .lst-kix_qeqyxe7gm97l-7>li:before { content: "\0025cb " } .lst-kix_qeqyxe7gm97l-8>li:before { content: "\0025a0 " } .lst-kix_5anu1k9tsyak-8>li:before { content: "\0025a0 " } ol.lst-kix_s3mi7ukxwiwf-2.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-2 0 } .lst-kix_yly1729bcywk-5>li { counter-increment: lst-ctn-kix_yly1729bcywk-5 } ul.lst-kix_686a8e4qhxwx-4 { list-style-type: none } ul.lst-kix_686a8e4qhxwx-3 { list-style-type: none } ul.lst-kix_686a8e4qhxwx-2 { list-style-type: none } ul.lst-kix_686a8e4qhxwx-1 { list-style-type: none } ul.lst-kix_686a8e4qhxwx-8 { list-style-type: none } ul.lst-kix_686a8e4qhxwx-7 { list-style-type: none } ul.lst-kix_686a8e4qhxwx-6 { list-style-type: none } .lst-kix_6qnkx7t1adn9-0>li:before { content: "\0025cf " } .lst-kix_qeqyxe7gm97l-0>li:before { content: "\0025cf " } ul.lst-kix_686a8e4qhxwx-5 { list-style-type: none } .lst-kix_6qnkx7t1adn9-1>li:before { content: "\0025cb " } .lst-kix_6qnkx7t1adn9-3>li:before { content: "\0025cf " } ul.lst-kix_686a8e4qhxwx-0 { list-style-type: none } .lst-kix_bfzyeb917dp8-0>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-0 } .lst-kix_qeqyxe7gm97l-5>li:before { content: "\0025a0 " } .lst-kix_j42a5dwgnqyq-0>li:before { content: "\0025cf " } .lst-kix_j42a5dwgnqyq-2>li:before { content: "\0025a0 " } .lst-kix_j42a5dwgnqyq-5>li:before { content: "\0025a0 " } ol.lst-kix_emhp84jkv42c-3.start { counter-reset: lst-ctn-kix_emhp84jkv42c-3 0 } .lst-kix_qeqyxe7gm97l-2>li:before { content: "\0025a0 " } .lst-kix_emhp84jkv42c-8>li { counter-increment: lst-ctn-kix_emhp84jkv42c-8 } ol.lst-kix_s3mi7ukxwiwf-0.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-0 0 } .lst-kix_86hsx13ssqid-8>li:before { content: "\0025a0 " } ol.lst-kix_vf0l197cqv6l-6 { list-style-type: none } ul.lst-kix_xoos54gyybzj-4 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-7 { list-style-type: none } ul.lst-kix_xoos54gyybzj-5 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-3.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-3 0 } ol.lst-kix_vf0l197cqv6l-4 { list-style-type: none } ul.lst-kix_xoos54gyybzj-6 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-5 { list-style-type: none } ul.lst-kix_xoos54gyybzj-7 { list-style-type: none } ul.lst-kix_xoos54gyybzj-8 { list-style-type: none } .lst-kix_s3mi7ukxwiwf-0>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-0 } ol.lst-kix_vf0l197cqv6l-8 { list-style-type: none } .lst-kix_yly1729bcywk-2>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-2, lower-roman) ". " } .lst-kix_fd1rucpc9vz2-5>li:before { content: "\0025a0 " } .lst-kix_fd1rucpc9vz2-7>li:before { content: "\0025cb " } ol.lst-kix_vf0l197cqv6l-2 { list-style-type: none } .lst-kix_pcjo479wrta-5>li:before { content: "\0025a0 " } .lst-kix_iv2x96orjh4l-5>li:before { content: "\0025a0 " } ul.lst-kix_xoos54gyybzj-0 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-3 { list-style-type: none } ul.lst-kix_xoos54gyybzj-1 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-0 { list-style-type: none } ul.lst-kix_xoos54gyybzj-2 { list-style-type: none } .lst-kix_yly1729bcywk-0>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-0, decimal) ". " } .lst-kix_yly1729bcywk-8>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-8, lower-roman) ". " } ul.lst-kix_xoos54gyybzj-3 { list-style-type: none } .lst-kix_iv2x96orjh4l-3>li:before { content: "\0025cf " } .lst-kix_5anu1k9tsyak-3>li:before { content: "\0025cf " } .lst-kix_5anu1k9tsyak-5>li:before { content: "\0025a0 " } .lst-kix_1wulu3ra2vwv-8>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-8 } ol.lst-kix_q8ok0mh9yyto-6 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-5 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-4 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-3 { list-style-type: none } .lst-kix_9jxnjym0nges-0>li:before { content: "\0025cf " } ol.lst-kix_q8ok0mh9yyto-8 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-7 { list-style-type: none } .lst-kix_xoos54gyybzj-8>li:before { content: "\0025a0 " } ol.lst-kix_emhp84jkv42c-0.start { counter-reset: lst-ctn-kix_emhp84jkv42c-0 0 } .lst-kix_opi66v2qdsjs-8>li:before { content: "\0025a0 " } .lst-kix_ndaonzmgp8vn-4>li:before { content: "\0025cb " } ol.lst-kix_q8ok0mh9yyto-2 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-1 { list-style-type: none } .lst-kix_9jxnjym0nges-2>li:before { content: "\0025a0 " } ol.lst-kix_q8ok0mh9yyto-0 { list-style-type: none } .lst-kix_xoos54gyybzj-6>li:before { content: "\0025cf " } .lst-kix_ndaonzmgp8vn-2>li:before { content: "\0025a0 " } .lst-kix_opi66v2qdsjs-2>li:before { content: "\0025a0 " } .lst-kix_11a9ub9xa97v-0>li:before { content: "" counter(lst-ctn-kix_11a9ub9xa97v-0, upper-roman) ". " } ol.lst-kix_bfzyeb917dp8-4.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-4 0 } .lst-kix_q8ok0mh9yyto-3>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-3 } .lst-kix_xoos54gyybzj-0>li:before { content: "\0025cf " } .lst-kix_11a9ub9xa97v-8>li:before { content: "(" counter(lst-ctn-kix_11a9ub9xa97v-8, lower-roman) ") " } .lst-kix_86hsx13ssqid-0>li:before { content: "\0025cf " } .lst-kix_86hsx13ssqid-6>li:before { content: "\0025cf " } .lst-kix_9jxnjym0nges-8>li:before { content: "\0025a0 " } .lst-kix_11a9ub9xa97v-6>li:before { content: "(" counter(lst-ctn-kix_11a9ub9xa97v-6, lower-roman) ") " } ul.lst-kix_9jxnjym0nges-2 { list-style-type: none } .lst-kix_xv318blpjdo-2>li:before { content: "" counter(lst-ctn-kix_xv318blpjdo-2, decimal) ". " } ul.lst-kix_9jxnjym0nges-1 { list-style-type: none } ul.lst-kix_9jxnjym0nges-4 { list-style-type: none } ul.lst-kix_9jxnjym0nges-3 { list-style-type: none } .lst-kix_h0kibz3smj6t-5>li:before { content: "\0025a0 " } ul.lst-kix_9jxnjym0nges-6 { list-style-type: none } ul.lst-kix_9jxnjym0nges-5 { list-style-type: none } ul.lst-kix_9jxnjym0nges-8 { list-style-type: none } ul.lst-kix_9jxnjym0nges-7 { list-style-type: none } .lst-kix_xv318blpjdo-2>li { counter-increment: lst-ctn-kix_xv318blpjdo-2 } .lst-kix_f5kb4hocu5hh-3>li:before { content: "\0025cf " } .lst-kix_s3mi7ukxwiwf-3>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-3 } .lst-kix_bfzyeb917dp8-7>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-7 } .lst-kix_f5kb4hocu5hh-8>li:before { content: "\0025a0 " } ol.lst-kix_emhp84jkv42c-1.start { counter-reset: lst-ctn-kix_emhp84jkv42c-1 0 } .lst-kix_jkgkf1u9sy0c-4>li:before { content: "\0025cb " } ol.lst-kix_jj5w63toozfm-3 { list-style-type: none } ol.lst-kix_jj5w63toozfm-4 { list-style-type: none } ol.lst-kix_jj5w63toozfm-5 { list-style-type: none } .lst-kix_jkgkf1u9sy0c-7>li:before { content: "\0025cb " } .lst-kix_xv318blpjdo-7>li:before { content: "(" counter(lst-ctn-kix_xv318blpjdo-7, lower-latin) ") " } .lst-kix_686a8e4qhxwx-5>li:before { content: "\0025a0 " } ol.lst-kix_jj5w63toozfm-6 { list-style-type: none } ol.lst-kix_jj5w63toozfm-7 { list-style-type: none } ol.lst-kix_jj5w63toozfm-8 { list-style-type: none } .lst-kix_h0kibz3smj6t-2>li:before { content: "\0025a0 " } .lst-kix_q8ok0mh9yyto-7>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-7 } ol.lst-kix_jj5w63toozfm-0 { list-style-type: none } ol.lst-kix_jj5w63toozfm-1 { list-style-type: none } .lst-kix_686a8e4qhxwx-2>li:before { content: "\0025a0 " } ol.lst-kix_jj5w63toozfm-2 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-3 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-8.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-8 0 } ol.lst-kix_11a9ub9xa97v-2 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-1 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-0 { list-style-type: none } .lst-kix_b7256qmdgo85-2>li:before { content: "\0025a0 " } ol.lst-kix_11a9ub9xa97v-8 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-7 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-6 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-5 { list-style-type: none } .lst-kix_4m04az9jmmj8-7>li:before { content: "\0025cb " } ol.lst-kix_11a9ub9xa97v-4 { list-style-type: none } .lst-kix_b7256qmdgo85-5>li:before { content: "\0025a0 " } .lst-kix_q97rvvc7c69e-1>li:before { content: "\0025cb " } .lst-kix_yly1729bcywk-2>li { counter-increment: lst-ctn-kix_yly1729bcywk-2 } .lst-kix_q8ok0mh9yyto-5>li:before { content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-5, lower-latin) ") " } .lst-kix_4m04az9jmmj8-4>li:before { content: "\0025cb " } .lst-kix_bfzyeb917dp8-3>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-3 } .lst-kix_ne7nl4nhpzqr-7>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-7, lower-latin) ". " } .lst-kix_q8ok0mh9yyto-8>li:before { content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-8, lower-roman) ") " } ol.lst-kix_bfzyeb917dp8-5 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-4 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-3 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-2 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-8 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-7 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-6 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-1 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-0 { list-style-type: none } ol.lst-kix_emhp84jkv42c-5.start { counter-reset: lst-ctn-kix_emhp84jkv42c-5 0 } .lst-kix_q8ok0mh9yyto-0>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-0 } .lst-kix_l7z426mwssm0-3>li:before { content: "\0025cf " } .lst-kix_iv2x96orjh4l-8>li:before { content: "\0025a0 " } .lst-kix_6qnkx7t1adn9-6>li:before { content: "\0025cf " } .lst-kix_gfromclascha-5>li:before { content: "\0025a0 " } .lst-kix_pcjo479wrta-2>li:before { content: "\0025a0 " } ol.lst-kix_emhp84jkv42c-8.start { counter-reset: lst-ctn-kix_emhp84jkv42c-8 0 } .lst-kix_11a9ub9xa97v-8>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-8 } .lst-kix_x1epm4iu41dp-5>li:before { content: "\0025a0 " } .lst-kix_q97rvvc7c69e-4>li:before { content: "\0025cb " } .lst-kix_xv318blpjdo-5>li { counter-increment: lst-ctn-kix_xv318blpjdo-5 } .lst-kix_1wulu3ra2vwv-5>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-5 } .lst-kix_5anu1k9tsyak-0>li:before { content: "\0025cf " } .lst-kix_fy6y7gyjejoh-4>li:before { content: "\0025cb " } .lst-kix_ndaonzmgp8vn-7>li:before { content: "\0025cb " } .lst-kix_iv2x96orjh4l-0>li:before { content: "\0025cf " } .lst-kix_yly1729bcywk-5>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-5, lower-roman) ". " } .lst-kix_s3mi7ukxwiwf-2>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-2, lower-roman) ". " } .lst-kix_6ril5iwt0fcl-7>li:before { content: "\0025cb " } .lst-kix_emhp84jkv42c-4>li:before { content: "(" counter(lst-ctn-kix_emhp84jkv42c-4, decimal) ") " } .lst-kix_emhp84jkv42c-5>li { counter-increment: lst-ctn-kix_emhp84jkv42c-5 } .lst-kix_jj5w63toozfm-4>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-4, lower-latin) ". " } .lst-kix_1wulu3ra2vwv-5>li:before { content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-5, lower-latin) ") " } ul.lst-kix_u0uqs69v9qbh-8 { list-style-type: none } .lst-kix_xoos54gyybzj-3>li:before { content: "\0025cf " } .lst-kix_11a9ub9xa97v-1>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-1 } ul.lst-kix_u0uqs69v9qbh-4 { list-style-type: none } .lst-kix_hchtl271h88l-6>li:before { content: "\0025cf " } ul.lst-kix_u0uqs69v9qbh-5 { list-style-type: none } .lst-kix_opi66v2qdsjs-5>li:before { content: "\0025a0 " } .lst-kix_lemcawe54w5c-5>li:before { content: "\0025a0 " } ul.lst-kix_u0uqs69v9qbh-6 { list-style-type: none } ul.lst-kix_u0uqs69v9qbh-7 { list-style-type: none } ul.lst-kix_u0uqs69v9qbh-0 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-6 { list-style-type: none } ul.lst-kix_u0uqs69v9qbh-1 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-5 { list-style-type: none } ul.lst-kix_u0uqs69v9qbh-2 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-8 { list-style-type: none } ul.lst-kix_u0uqs69v9qbh-3 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-7 { list-style-type: none } ol.lst-kix_emhp84jkv42c-7.start { counter-reset: lst-ctn-kix_emhp84jkv42c-7 0 } .lst-kix_fd1rucpc9vz2-2>li:before { content: "\0025a0 " } ul.lst-kix_jkgkf1u9sy0c-4 { list-style-type: none } ul.lst-kix_jkgkf1u9sy0c-5 { list-style-type: none } ul.lst-kix_jkgkf1u9sy0c-6 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-0 { list-style-type: none } ul.lst-kix_jkgkf1u9sy0c-7 { list-style-type: none } .lst-kix_bfzyeb917dp8-2>li:before { content: "" counter(lst-ctn-kix_bfzyeb917dp8-2, decimal) ". " } .lst-kix_gyhqddkw9i05-1>li:before { content: "\0025cb " } ul.lst-kix_jkgkf1u9sy0c-8 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-2 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-1 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-4 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-3 { list-style-type: none } .lst-kix_11a9ub9xa97v-3>li:before { content: "" counter(lst-ctn-kix_11a9ub9xa97v-3, lower-latin) ") " } ol.lst-kix_emhp84jkv42c-6.start { counter-reset: lst-ctn-kix_emhp84jkv42c-6 0 } .lst-kix_8p26nc4xx5n8-1>li:before { content: "\0025cb " } .lst-kix_u0uqs69v9qbh-5>li:before { content: "\0025a0 " } .lst-kix_f5kb4hocu5hh-0>li:before { content: "\0025cf " } .lst-kix_9jxnjym0nges-5>li:before { content: "\0025a0 " } .lst-kix_86hsx13ssqid-3>li:before { content: "\0025cf " } ul.lst-kix_jkgkf1u9sy0c-0 { list-style-type: none } ul.lst-kix_jkgkf1u9sy0c-1 { list-style-type: none } ul.lst-kix_jkgkf1u9sy0c-2 { list-style-type: none } ul.lst-kix_jkgkf1u9sy0c-3 { list-style-type: none } .lst-kix_vf0l197cqv6l-2>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-2 } ol.lst-kix_jj5w63toozfm-5.start { counter-reset: lst-ctn-kix_jj5w63toozfm-5 0 } ul.lst-kix_bijol4nzhwf0-8 { list-style-type: none } ol.lst-kix_emhp84jkv42c-0 { list-style-type: none } ol.lst-kix_emhp84jkv42c-2 { list-style-type: none } ol.lst-kix_emhp84jkv42c-1 { list-style-type: none } ol.lst-kix_emhp84jkv42c-4 { list-style-type: none } ol.lst-kix_emhp84jkv42c-3 { list-style-type: none } ol.lst-kix_emhp84jkv42c-6 { list-style-type: none } ol.lst-kix_emhp84jkv42c-5 { list-style-type: none } ol.lst-kix_emhp84jkv42c-8 { list-style-type: none } .lst-kix_yly1729bcywk-7>li { counter-increment: lst-ctn-kix_yly1729bcywk-7 } ol.lst-kix_emhp84jkv42c-7 { list-style-type: none } .lst-kix_11a9ub9xa97v-4>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-4 } .lst-kix_1qz6dmm9b14l-4>li:before { content: "\0025cb " } .lst-kix_1qz6dmm9b14l-3>li:before { content: "\0025cf " } .lst-kix_1qz6dmm9b14l-5>li:before { content: "\0025a0 " } ul.lst-kix_j42a5dwgnqyq-0 { list-style-type: none } ul.lst-kix_j42a5dwgnqyq-1 { list-style-type: none } ul.lst-kix_j42a5dwgnqyq-2 { list-style-type: none } ul.lst-kix_j42a5dwgnqyq-3 { list-style-type: none } ul.lst-kix_j42a5dwgnqyq-4 { list-style-type: none } ul.lst-kix_j42a5dwgnqyq-5 { list-style-type: none } .lst-kix_1qz6dmm9b14l-0>li:before { content: "\0025cf " } .lst-kix_1qz6dmm9b14l-8>li:before { content: "\0025a0 " } ul.lst-kix_j42a5dwgnqyq-6 { list-style-type: none } ul.lst-kix_j42a5dwgnqyq-7 { list-style-type: none } .lst-kix_1qz6dmm9b14l-1>li:before { content: "\0025cb " } ol.lst-kix_bfzyeb917dp8-0.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-0 0 } ul.lst-kix_j42a5dwgnqyq-8 { list-style-type: none } .lst-kix_1qz6dmm9b14l-2>li:before { content: "\0025a0 " } ul.lst-kix_bijol4nzhwf0-4 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-5 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-6 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-7 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-0 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-1 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-2 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-3 { list-style-type: none } .lst-kix_jj5w63toozfm-3>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-3, decimal) ". " } .lst-kix_1wulu3ra2vwv-2>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-2 } .lst-kix_1qz6dmm9b14l-7>li:before { content: "\0025cb " } .lst-kix_jj5w63toozfm-2>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-2, lower-roman) ". " } .lst-kix_ne7nl4nhpzqr-3>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-3 } .lst-kix_q8ok0mh9yyto-4>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-4 } .lst-kix_1qz6dmm9b14l-6>li:before { content: "\0025cf " } .lst-kix_jj5w63toozfm-1>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-1, lower-latin) ". " } .lst-kix_h9mjmxara98n-7>li:before { content: "\0025cb " } .lst-kix_bijol4nzhwf0-7>li:before { content: "\0025cb " } .lst-kix_jj5w63toozfm-0>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-0, decimal) ". " } .lst-kix_h9mjmxara98n-6>li:before { content: "\0025cf " } .lst-kix_h9mjmxara98n-8>li:before { content: "\0025a0 " } .lst-kix_bijol4nzhwf0-6>li:before { content: "\0025cf " } .lst-kix_bijol4nzhwf0-8>li:before { content: "\0025a0 " } .lst-kix_h9mjmxara98n-5>li:before { content: "\0025a0 " } .lst-kix_bijol4nzhwf0-5>li:before { content: "\0025a0 " } .lst-kix_h9mjmxara98n-3>li:before { content: "\0025cf " } .lst-kix_bijol4nzhwf0-3>li:before { content: "\0025cf " } .lst-kix_h9mjmxara98n-2>li:before { content: "\0025a0 " } .lst-kix_h9mjmxara98n-4>li:before { content: "\0025cb " } .lst-kix_bijol4nzhwf0-2>li:before { content: "\0025a0 " } .lst-kix_bijol4nzhwf0-4>li:before { content: "\0025cb " } ol.lst-kix_q8ok0mh9yyto-1.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-1 0 } ol.lst-kix_s3mi7ukxwiwf-1.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-1 0 } .lst-kix_h9mjmxara98n-0>li:before { content: "\0025cf " } .lst-kix_bijol4nzhwf0-0>li:before { content: "\0025cf " } .lst-kix_h9mjmxara98n-1>li:before { content: "\0025cb " } .lst-kix_bijol4nzhwf0-1>li:before { content: "\0025cb " } .lst-kix_jj5w63toozfm-8>li { counter-increment: lst-ctn-kix_jj5w63toozfm-8 } ol.lst-kix_ne7nl4nhpzqr-3.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-3 0 } ul.lst-kix_gfromclascha-0 { list-style-type: none } ol.lst-kix_emhp84jkv42c-2.start { counter-reset: lst-ctn-kix_emhp84jkv42c-2 0 } .lst-kix_l7z426mwssm0-2>li:before { content: "\0025a0 " } .lst-kix_ne7nl4nhpzqr-4>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-4, lower-latin) ". " } .lst-kix_l7z426mwssm0-0>li:before { content: "\0025cf " } .lst-kix_l7z426mwssm0-4>li:before { content: "\0025cb " } ul.lst-kix_gfromclascha-7 { list-style-type: none } ul.lst-kix_gfromclascha-8 { list-style-type: none } ul.lst-kix_gfromclascha-5 { list-style-type: none } .lst-kix_ne7nl4nhpzqr-0>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-0, decimal) ". " } .lst-kix_ne7nl4nhpzqr-2>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-2, lower-roman) ". " } ul.lst-kix_gfromclascha-6 { list-style-type: none } .lst-kix_x1epm4iu41dp-8>li:before { content: "\0025a0 " } ul.lst-kix_gfromclascha-3 { list-style-type: none } ul.lst-kix_gfromclascha-4 { list-style-type: none } ul.lst-kix_gfromclascha-1 { list-style-type: none } .lst-kix_bfzyeb917dp8-3>li:before { content: "" counter(lst-ctn-kix_bfzyeb917dp8-3, lower-latin) ") " } ul.lst-kix_gfromclascha-2 { list-style-type: none } ul.lst-kix_opi66v2qdsjs-3 { list-style-type: none } .lst-kix_x1epm4iu41dp-2>li:before { content: "\0025a0 " } ol.lst-kix_11a9ub9xa97v-1.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-1 0 } ul.lst-kix_opi66v2qdsjs-2 { list-style-type: none } ul.lst-kix_opi66v2qdsjs-1 { list-style-type: none } ul.lst-kix_opi66v2qdsjs-0 { list-style-type: none } .lst-kix_q8ok0mh9yyto-0>li:before { content: "" counter(lst-ctn-kix_q8ok0mh9yyto-0, upper-roman) ". " } .lst-kix_fy6y7gyjejoh-3>li:before { content: "\0025cf " } .lst-kix_bfzyeb917dp8-5>li:before { content: "(" counter(lst-ctn-kix_bfzyeb917dp8-5, lower-latin) ") " } .lst-kix_jj5w63toozfm-0>li { counter-increment: lst-ctn-kix_jj5w63toozfm-0 } .lst-kix_x1epm4iu41dp-6>li:before { content: "\0025cf " } ul.lst-kix_opi66v2qdsjs-8 { list-style-type: none } ul.lst-kix_opi66v2qdsjs-7 { list-style-type: none } .lst-kix_x1epm4iu41dp-4>li:before { content: "\0025cb " } ul.lst-kix_opi66v2qdsjs-6 { list-style-type: none } ul.lst-kix_opi66v2qdsjs-5 { list-style-type: none } .lst-kix_fy6y7gyjejoh-1>li:before { content: "\0025cb " } ul.lst-kix_opi66v2qdsjs-4 { list-style-type: none } .lst-kix_bfzyeb917dp8-7>li:before { content: "(" counter(lst-ctn-kix_bfzyeb917dp8-7, lower-latin) ") " } .lst-kix_emhp84jkv42c-7>li { counter-increment: lst-ctn-kix_emhp84jkv42c-7 } .lst-kix_fy6y7gyjejoh-7>li:before { content: "\0025cb " } ol.lst-kix_xv318blpjdo-1.start { counter-reset: lst-ctn-kix_xv318blpjdo-1 0 } .lst-kix_x1epm4iu41dp-0>li:before { content: "\0025cf " } ol.lst-kix_vf0l197cqv6l-0.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-0 0 } .lst-kix_fy6y7gyjejoh-5>li:before { content: "\0025a0 " } .lst-kix_emhp84jkv42c-3>li:before { content: "" counter(lst-ctn-kix_emhp84jkv42c-3, lower-latin) ") " } .lst-kix_emhp84jkv42c-5>li:before { content: "(" counter(lst-ctn-kix_emhp84jkv42c-5, lower-latin) ") " } .lst-kix_lemcawe54w5c-8>li:before { content: "\0025a0 " } ol.lst-kix_yly1729bcywk-4.start { counter-reset: lst-ctn-kix_yly1729bcywk-4 0 } .lst-kix_emhp84jkv42c-1>li:before { content: "" counter(lst-ctn-kix_emhp84jkv42c-1, upper-latin) ". " } .lst-kix_emhp84jkv42c-7>li:before { content: "(" counter(lst-ctn-kix_emhp84jkv42c-7, lower-latin) ") " } .lst-kix_lemcawe54w5c-6>li:before { content: "\0025cf " } .lst-kix_jj5w63toozfm-5>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-5, lower-roman) ". " } .lst-kix_bfzyeb917dp8-2>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-2 } ul.lst-kix_1qz6dmm9b14l-6 { list-style-type: none } .lst-kix_lemcawe54w5c-4>li:before { content: "\0025cb " } .lst-kix_gyhqddkw9i05-8>li:before { content: "\0025a0 " } .lst-kix_jj5w63toozfm-7>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-7, lower-latin) ". " } ul.lst-kix_1qz6dmm9b14l-5 { list-style-type: none } ul.lst-kix_1qz6dmm9b14l-8 { list-style-type: none } ul.lst-kix_1qz6dmm9b14l-7 { list-style-type: none } .lst-kix_jj5w63toozfm-1>li { counter-increment: lst-ctn-kix_jj5w63toozfm-1 } ul.lst-kix_1qz6dmm9b14l-2 { list-style-type: none } ul.lst-kix_1qz6dmm9b14l-1 { list-style-type: none } ul.lst-kix_1qz6dmm9b14l-4 { list-style-type: none } ul.lst-kix_1qz6dmm9b14l-3 { list-style-type: none } .lst-kix_u0uqs69v9qbh-0>li:before { content: "\0025cf " } .lst-kix_u0uqs69v9qbh-4>li:before { content: "\0025cb " } ul.lst-kix_1qz6dmm9b14l-0 { list-style-type: none } .lst-kix_s3mi7ukxwiwf-6>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-6 } .lst-kix_jj5w63toozfm-7>li { counter-increment: lst-ctn-kix_jj5w63toozfm-7 } .lst-kix_lemcawe54w5c-2>li:before { content: "\0025a0 " } .lst-kix_u0uqs69v9qbh-2>li:before { content: "\0025a0 " } .lst-kix_8p26nc4xx5n8-6>li:before { content: "\0025cf " } ol.lst-kix_1wulu3ra2vwv-4.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-4 0 } .lst-kix_l7z426mwssm0-8>li:before { content: "\0025a0 " } .lst-kix_u0uqs69v9qbh-8>li:before { content: "\0025a0 " } .lst-kix_bfzyeb917dp8-1>li:before { content: "" counter(lst-ctn-kix_bfzyeb917dp8-1, upper-latin) ". " } ul.lst-kix_ekmayt81kvbz-8 { list-style-type: none } .lst-kix_gyhqddkw9i05-0>li:before { content: "\0025cf " } ul.lst-kix_ekmayt81kvbz-7 { list-style-type: none } .lst-kix_gyhqddkw9i05-4>li:before { content: "\0025cb " } .lst-kix_l7z426mwssm0-6>li:before { content: "\0025cf " } .lst-kix_8p26nc4xx5n8-2>li:before { content: "\0025a0 " } ul.lst-kix_ekmayt81kvbz-6 { list-style-type: none } ul.lst-kix_ekmayt81kvbz-5 { list-style-type: none } .lst-kix_lemcawe54w5c-0>li:before { content: "\0025cf " } ul.lst-kix_ekmayt81kvbz-4 { list-style-type: none } ul.lst-kix_ekmayt81kvbz-3 { list-style-type: none } .lst-kix_gyhqddkw9i05-6>li:before { content: "\0025cf " } .lst-kix_8p26nc4xx5n8-0>li:before { content: "\0025cf " } .lst-kix_8p26nc4xx5n8-8>li:before { content: "\0025a0 " } ul.lst-kix_ekmayt81kvbz-2 { list-style-type: none } ul.lst-kix_ekmayt81kvbz-1 { list-style-type: none } .lst-kix_u0uqs69v9qbh-6>li:before { content: "\0025cf " } ul.lst-kix_ekmayt81kvbz-0 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-1 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-5.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-5 0 } ol.lst-kix_s3mi7ukxwiwf-2 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-0 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-1 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-5 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-2 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-6 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-3 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-0 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-4 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-5 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-6 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-3 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-7 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-4 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-8 { list-style-type: none } .lst-kix_gyhqddkw9i05-2>li:before { content: "\0025a0 " } .lst-kix_8p26nc4xx5n8-4>li:before { content: "\0025cb " } ul.lst-kix_7tib3jrzu2u9-7 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-8 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-7.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-7 0 } .lst-kix_yly1729bcywk-6>li { counter-increment: lst-ctn-kix_yly1729bcywk-6 } .lst-kix_xv318blpjdo-1>li:before { content: "" counter(lst-ctn-kix_xv318blpjdo-1, upper-latin) ". " } .lst-kix_xv318blpjdo-0>li:before { content: "" counter(lst-ctn-kix_xv318blpjdo-0, upper-roman) ". " } .lst-kix_h0kibz3smj6t-4>li:before { content: "\0025cb " } .lst-kix_ne7nl4nhpzqr-4>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-4 } .lst-kix_1wulu3ra2vwv-1>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-1 } .lst-kix_h0kibz3smj6t-7>li:before { content: "\0025cb " } .lst-kix_h0kibz3smj6t-8>li:before { content: "\0025a0 " } .lst-kix_11a9ub9xa97v-5>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-5 } .lst-kix_opi66v2qdsjs-0>li:before { content: "\0025cf " } .lst-kix_686a8e4qhxwx-7>li:before { content: "\0025cb " } .lst-kix_xv318blpjdo-8>li:before { content: "(" counter(lst-ctn-kix_xv318blpjdo-8, lower-roman) ") " } .lst-kix_xv318blpjdo-5>li:before { content: "(" counter(lst-ctn-kix_xv318blpjdo-5, lower-latin) ") " } .lst-kix_h0kibz3smj6t-3>li:before { content: "\0025cf " } .lst-kix_686a8e4qhxwx-3>li:before { content: "\0025cf " } .lst-kix_686a8e4qhxwx-4>li:before { content: "\0025cb " } .lst-kix_xv318blpjdo-4>li:before { content: "(" counter(lst-ctn-kix_xv318blpjdo-4, decimal) ") " } .lst-kix_h0kibz3smj6t-0>li:before { content: "\0025cf " } ol.lst-kix_vf0l197cqv6l-4.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-4 0 } ol.lst-kix_ne7nl4nhpzqr-2.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-2 0 } ol.lst-kix_11a9ub9xa97v-0.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-0 0 } .lst-kix_s3mi7ukxwiwf-7>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-7 } ul.lst-kix_l7z426mwssm0-1 { list-style-type: none } ul.lst-kix_l7z426mwssm0-2 { list-style-type: none } ul.lst-kix_l7z426mwssm0-0 { list-style-type: none } ol.lst-kix_yly1729bcywk-8.start { counter-reset: lst-ctn-kix_yly1729bcywk-8 0 } .lst-kix_ne7nl4nhpzqr-2>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-2 } .lst-kix_q8ok0mh9yyto-3>li:before { content: "" counter(lst-ctn-kix_q8ok0mh9yyto-3, lower-latin) ") " } .lst-kix_pcjo479wrta-7>li:before { content: "\0025cb " } .lst-kix_686a8e4qhxwx-8>li:before { content: "\0025a0 " } .lst-kix_emhp84jkv42c-6>li { counter-increment: lst-ctn-kix_emhp84jkv42c-6 } ul.lst-kix_l7z426mwssm0-7 { list-style-type: none } ul.lst-kix_l7z426mwssm0-8 { list-style-type: none } .lst-kix_q8ok0mh9yyto-2>li:before { content: "" counter(lst-ctn-kix_q8ok0mh9yyto-2, decimal) ". " } .lst-kix_pcjo479wrta-8>li:before { content: "\0025a0 " } ul.lst-kix_l7z426mwssm0-5 { list-style-type: none } ul.lst-kix_l7z426mwssm0-6 { list-style-type: none } ul.lst-kix_l7z426mwssm0-3 { list-style-type: none } ul.lst-kix_l7z426mwssm0-4 { list-style-type: none } .lst-kix_yly1729bcywk-8>li { counter-increment: lst-ctn-kix_yly1729bcywk-8 } .lst-kix_vf0l197cqv6l-3>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-3 } .lst-kix_q8ok0mh9yyto-6>li:before { content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-6, lower-roman) ") " } .lst-kix_4m04az9jmmj8-2>li:before { content: "\0025a0 " } .lst-kix_4m04az9jmmj8-6>li:before { content: "\0025cf " } .lst-kix_q8ok0mh9yyto-7>li:before { content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-7, lower-latin) ") " } .lst-kix_4m04az9jmmj8-1>li:before { content: "\0025cb " } .lst-kix_4m04az9jmmj8-5>li:before { content: "\0025a0 " } ol.lst-kix_vf0l197cqv6l-5.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-5 0 } .lst-kix_ne7nl4nhpzqr-8>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-8, lower-roman) ". " } .lst-kix_xv318blpjdo-4>li { counter-increment: lst-ctn-kix_xv318blpjdo-4 } .lst-kix_vf0l197cqv6l-8>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-8 } .lst-kix_ne7nl4nhpzqr-5>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-5, lower-roman) ". " } .lst-kix_l7z426mwssm0-1>li:before { content: "\0025cb " } .lst-kix_x1epm4iu41dp-7>li:before { content: "\0025cb " } .lst-kix_yly1729bcywk-1>li { counter-increment: lst-ctn-kix_yly1729bcywk-1 } .lst-kix_6qnkx7t1adn9-4>li:before { content: "\0025cb " } .lst-kix_6qnkx7t1adn9-8>li:before { content: "\0025a0 " } .lst-kix_xv318blpjdo-6>li { counter-increment: lst-ctn-kix_xv318blpjdo-6 } ol.lst-kix_jj5w63toozfm-1.start { counter-reset: lst-ctn-kix_jj5w63toozfm-1 0 } .lst-kix_ne7nl4nhpzqr-1>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-1, lower-latin) ". " } .lst-kix_pcjo479wrta-4>li:before { content: "\0025cb " } ol.lst-kix_ne7nl4nhpzqr-8.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-8 0 } .lst-kix_bfzyeb917dp8-4>li:before { content: "(" counter(lst-ctn-kix_bfzyeb917dp8-4, decimal) ") " } .lst-kix_x1epm4iu41dp-3>li:before { content: "\0025cf " } .lst-kix_fd1rucpc9vz2-8>li:before { content: "\0025a0 " } .lst-kix_bfzyeb917dp8-8>li:before { content: "(" counter(lst-ctn-kix_bfzyeb917dp8-8, lower-roman) ") " } .lst-kix_fy6y7gyjejoh-2>li:before { content: "\0025a0 " } .lst-kix_fy6y7gyjejoh-6>li:before { content: "\0025cf " } ol.lst-kix_1wulu3ra2vwv-8.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-8 0 } .lst-kix_pcjo479wrta-0>li:before { content: "\0025cf " } ol.lst-kix_s3mi7ukxwiwf-6.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-6 0 } ol.lst-kix_jj5w63toozfm-0.start { counter-reset: lst-ctn-kix_jj5w63toozfm-0 0 } .lst-kix_emhp84jkv42c-2>li:before { content: "" counter(lst-ctn-kix_emhp84jkv42c-2, decimal) ". " } .lst-kix_emhp84jkv42c-6>li:before { content: "(" counter(lst-ctn-kix_emhp84jkv42c-6, lower-roman) ") " } .lst-kix_686a8e4qhxwx-0>li:before { content: "\0025cf " } .lst-kix_ndaonzmgp8vn-5>li:before { content: "\0025a0 " } .lst-kix_9jxnjym0nges-3>li:before { content: "\0025cf " } .lst-kix_opi66v2qdsjs-7>li:before { content: "\0025cb " } .lst-kix_lemcawe54w5c-7>li:before { content: "\0025cb " } .lst-kix_ndaonzmgp8vn-1>li:before { content: "\0025cb " } .lst-kix_gyhqddkw9i05-7>li:before { content: "\0025cb " } .lst-kix_jj5w63toozfm-6>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-6, decimal) ". " } .lst-kix_u0uqs69v9qbh-3>li:before { content: "\0025cf " } .lst-kix_fd1rucpc9vz2-0>li:before { content: "\0025cf " } .lst-kix_fd1rucpc9vz2-4>li:before { content: "\0025cb " } ol.lst-kix_s3mi7ukxwiwf-5.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-5 0 } .lst-kix_opi66v2qdsjs-3>li:before { content: "\0025cf " } .lst-kix_lemcawe54w5c-3>li:before { content: "\0025cf " } .lst-kix_8p26nc4xx5n8-3>li:before { content: "\0025cf " } .lst-kix_8p26nc4xx5n8-7>li:before { content: "\0025cb " } .lst-kix_l7z426mwssm0-5>li:before { content: "\0025a0 " } .lst-kix_u0uqs69v9qbh-7>li:before { content: "\0025cb " } .lst-kix_bfzyeb917dp8-0>li:before { content: "" counter(lst-ctn-kix_bfzyeb917dp8-0, upper-roman) ". " } .lst-kix_11a9ub9xa97v-1>li:before { content: "" counter(lst-ctn-kix_11a9ub9xa97v-1, upper-latin) ". " } .lst-kix_gyhqddkw9i05-3>li:before { content: "\0025cf " } .lst-kix_9jxnjym0nges-7>li:before { content: "\0025cb " } .lst-kix_11a9ub9xa97v-5>li:before { content: "(" counter(lst-ctn-kix_11a9ub9xa97v-5, lower-latin) ") " } ol.lst-kix_11a9ub9xa97v-2.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-2 0 } .lst-kix_s3mi7ukxwiwf-4>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-4 } .lst-kix_7tib3jrzu2u9-4>li:before { content: "\0025cb " } .lst-kix_ne7nl4nhpzqr-5>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-5 } ol.lst-kix_xv318blpjdo-4 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-7.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-7 0 } ol.lst-kix_xv318blpjdo-5 { list-style-type: none } ol.lst-kix_xv318blpjdo-6 { list-style-type: none } ol.lst-kix_xv318blpjdo-7 { list-style-type: none } ol.lst-kix_xv318blpjdo-0 { list-style-type: none } ol.lst-kix_xv318blpjdo-1 { list-style-type: none } .lst-kix_7tib3jrzu2u9-1>li:before { content: "\0025cb " } ol.lst-kix_ne7nl4nhpzqr-4.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-4 0 } ol.lst-kix_xv318blpjdo-2 { list-style-type: none } ol.lst-kix_xv318blpjdo-3 { list-style-type: none } .lst-kix_q8ok0mh9yyto-6>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-6 } ul.lst-kix_5anu1k9tsyak-7 { list-style-type: none } .lst-kix_jj5w63toozfm-6>li { counter-increment: lst-ctn-kix_jj5w63toozfm-6 } ul.lst-kix_5anu1k9tsyak-8 { list-style-type: none } ul.lst-kix_5anu1k9tsyak-5 { list-style-type: none } ol.lst-kix_yly1729bcywk-5.start { counter-reset: lst-ctn-kix_yly1729bcywk-5 0 } .lst-kix_11a9ub9xa97v-2>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-2 } ol.lst-kix_1wulu3ra2vwv-0 { list-style-type: none } ul.lst-kix_5anu1k9tsyak-6 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-1 { list-style-type: none } ul.lst-kix_5anu1k9tsyak-3 { list-style-type: none } ul.lst-kix_5anu1k9tsyak-4 { list-style-type: none } ul.lst-kix_5anu1k9tsyak-1 { list-style-type: none } .lst-kix_xv318blpjdo-3>li { counter-increment: lst-ctn-kix_xv318blpjdo-3 } ul.lst-kix_5anu1k9tsyak-2 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-6 { list-style-type: none } ul.lst-kix_5anu1k9tsyak-0 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-7 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-8 { list-style-type: none } .lst-kix_7tib3jrzu2u9-6>li:before { content: "\0025cf " } ol.lst-kix_xv318blpjdo-8 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-2 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-3 { list-style-type: none } .lst-kix_7tib3jrzu2u9-7>li:before { content: "\0025cb " } ol.lst-kix_1wulu3ra2vwv-4 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-5 { list-style-type: none } .lst-kix_vf0l197cqv6l-4>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-4 } ol.lst-kix_1wulu3ra2vwv-5.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-5 0 } ol.lst-kix_11a9ub9xa97v-7.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-7 0 } ol.lst-kix_q8ok0mh9yyto-2.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-2 0 } .lst-kix_11a9ub9xa97v-6>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-6 } .lst-kix_5anu1k9tsyak-7>li:before { content: "\0025cb " } .lst-kix_j42a5dwgnqyq-6>li:before { content: "\0025cf " } ol.lst-kix_xv318blpjdo-2.start { counter-reset: lst-ctn-kix_xv318blpjdo-2 0 } .lst-kix_1wulu3ra2vwv-4>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-4 } .lst-kix_q8ok0mh9yyto-2>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-2 } ol.lst-kix_jj5w63toozfm-4.start { counter-reset: lst-ctn-kix_jj5w63toozfm-4 0 } .lst-kix_vf0l197cqv6l-0>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-0 } ol.lst-kix_yly1729bcywk-0.start { counter-reset: lst-ctn-kix_yly1729bcywk-0 0 } .lst-kix_6qnkx7t1adn9-2>li:before { content: "\0025a0 " } .lst-kix_qeqyxe7gm97l-6>li:before { content: "\0025cf " } .lst-kix_qeqyxe7gm97l-4>li:before { content: "\0025cb " } .lst-kix_j42a5dwgnqyq-1>li:before { content: "\0025cb " } .lst-kix_qeqyxe7gm97l-1>li:before { content: "\0025cb " } .lst-kix_qeqyxe7gm97l-3>li:before { content: "\0025cf " } .lst-kix_j42a5dwgnqyq-4>li:before { content: "\0025cb " } ol.lst-kix_1wulu3ra2vwv-0.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-0 0 } ol.lst-kix_q8ok0mh9yyto-7.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-7 0 } .lst-kix_j42a5dwgnqyq-3>li:before { content: "\0025cf " } .lst-kix_jj5w63toozfm-2>li { counter-increment: lst-ctn-kix_jj5w63toozfm-2 } ol.lst-kix_1wulu3ra2vwv-3.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-3 0 } ol.lst-kix_q8ok0mh9yyto-0.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-0 0 } .lst-kix_6qnkx7t1adn9-5>li:before { content: "\0025a0 " } .lst-kix_6qnkx7t1adn9-7>li:before { content: "\0025cb " } ol.lst-kix_yly1729bcywk-3.start { counter-reset: lst-ctn-kix_yly1729bcywk-3 0 } .lst-kix_iv2x96orjh4l-7>li:before { content: "\0025cb " } .lst-kix_pcjo479wrta-3>li:before { content: "\0025cf " } .lst-kix_yly1729bcywk-6>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-6, decimal) ". " } .lst-kix_ndaonzmgp8vn-6>li:before { content: "\0025cf " } .lst-kix_5anu1k9tsyak-1>li:before { content: "\0025cb " } .lst-kix_ndaonzmgp8vn-8>li:before { content: "\0025a0 " } .lst-kix_pcjo479wrta-1>li:before { content: "\0025cb " } .lst-kix_iv2x96orjh4l-1>li:before { content: "\0025cb " } .lst-kix_yly1729bcywk-4>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-4, lower-latin) ". " } .lst-kix_bfzyeb917dp8-8>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-8 } .lst-kix_ne7nl4nhpzqr-1>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-1 } .lst-kix_opi66v2qdsjs-4>li:before { content: "\0025cb " } .lst-kix_fd1rucpc9vz2-1>li:before { content: "\0025cb " } .lst-kix_fd1rucpc9vz2-3>li:before { content: "\0025cf " } .lst-kix_opi66v2qdsjs-6>li:before { content: "\0025cf " } ol.lst-kix_11a9ub9xa97v-4.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-4 0 } .lst-kix_xoos54gyybzj-4>li:before { content: "\0025cb " } .lst-kix_bfzyeb917dp8-1>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-1 } .lst-kix_ndaonzmgp8vn-0>li:before { content: "\0025cf " } ol.lst-kix_jj5w63toozfm-6.start { counter-reset: lst-ctn-kix_jj5w63toozfm-6 0 } .lst-kix_xoos54gyybzj-2>li:before { content: "\0025a0 " } ul.lst-kix_b7256qmdgo85-6 { list-style-type: none } ul.lst-kix_b7256qmdgo85-7 { list-style-type: none } .lst-kix_1wulu3ra2vwv-3>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-3 } ul.lst-kix_b7256qmdgo85-8 { list-style-type: none } ul.lst-kix_b7256qmdgo85-2 { list-style-type: none } ul.lst-kix_b7256qmdgo85-3 { list-style-type: none } .lst-kix_11a9ub9xa97v-4>li:before { content: "(" counter(lst-ctn-kix_11a9ub9xa97v-4, decimal) ") " } ul.lst-kix_b7256qmdgo85-4 { list-style-type: none } ul.lst-kix_b7256qmdgo85-5 { list-style-type: none } .lst-kix_f5kb4hocu5hh-1>li:before { content: "\0025cb " } .lst-kix_11a9ub9xa97v-2>li:before { content: "" counter(lst-ctn-kix_11a9ub9xa97v-2, decimal) ". " } .lst-kix_9jxnjym0nges-4>li:before { content: "\0025cb " } .lst-kix_86hsx13ssqid-4>li:before { content: "\0025cb " } ul.lst-kix_b7256qmdgo85-0 { list-style-type: none } ul.lst-kix_b7256qmdgo85-1 { list-style-type: none } .lst-kix_9jxnjym0nges-6>li:before { content: "\0025cf " } .lst-kix_86hsx13ssqid-2>li:before { content: "\0025a0 " } .lst-kix_bfzyeb917dp8-5>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-5 } .lst-kix_h0kibz3smj6t-6>li:before { content: "\0025cf " } .lst-kix_11a9ub9xa97v-3>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-3 } ol.lst-kix_11a9ub9xa97v-5.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-5 0 } ul.lst-kix_x1epm4iu41dp-0 { list-style-type: none } .lst-kix_f5kb4hocu5hh-4>li:before { content: "\0025cb " } ol.lst-kix_xv318blpjdo-0.start { counter-reset: lst-ctn-kix_xv318blpjdo-0 0 } .lst-kix_jkgkf1u9sy0c-0>li:before { content: "\0025cf " } .lst-kix_f5kb4hocu5hh-7>li:before { content: "\0025cb " } ul.lst-kix_x1epm4iu41dp-6 { list-style-type: none } ul.lst-kix_x1epm4iu41dp-5 { list-style-type: none } ul.lst-kix_x1epm4iu41dp-8 { list-style-type: none } .lst-kix_jkgkf1u9sy0c-3>li:before { content: "\0025cf " } ul.lst-kix_x1epm4iu41dp-7 { list-style-type: none } ul.lst-kix_x1epm4iu41dp-2 { list-style-type: none } .lst-kix_xv318blpjdo-0>li { counter-increment: lst-ctn-kix_xv318blpjdo-0 } ol.lst-kix_jj5w63toozfm-8.start { counter-reset: lst-ctn-kix_jj5w63toozfm-8 0 } ul.lst-kix_x1epm4iu41dp-1 { list-style-type: none } ul.lst-kix_x1epm4iu41dp-4 { list-style-type: none } ul.lst-kix_x1epm4iu41dp-3 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-2.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-2 0 } .lst-kix_686a8e4qhxwx-6>li:before { content: "\0025cf " } .lst-kix_s3mi7ukxwiwf-5>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-5 } .lst-kix_h0kibz3smj6t-1>li:before { content: "\0025cb " } .lst-kix_xv318blpjdo-6>li:before { content: "(" counter(lst-ctn-kix_xv318blpjdo-6, lower-roman) ") " } ul.lst-kix_86hsx13ssqid-3 { list-style-type: none } ul.lst-kix_86hsx13ssqid-2 { list-style-type: none } .lst-kix_xv318blpjdo-3>li:before { content: "" counter(lst-ctn-kix_xv318blpjdo-3, lower-latin) ") " } ul.lst-kix_86hsx13ssqid-5 { list-style-type: none } ul.lst-kix_86hsx13ssqid-4 { list-style-type: none } .lst-kix_686a8e4qhxwx-1>li:before { content: "\0025cb " } ol.lst-kix_yly1729bcywk-2.start { counter-reset: lst-ctn-kix_yly1729bcywk-2 0 } ul.lst-kix_86hsx13ssqid-1 { list-style-type: none } .lst-kix_jkgkf1u9sy0c-8>li:before { content: "\0025a0 " } ul.lst-kix_86hsx13ssqid-0 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-0 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-1 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-2 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-3 { list-style-type: none } .lst-kix_b7256qmdgo85-1>li:before { content: "\0025cb " } ul.lst-kix_86hsx13ssqid-7 { list-style-type: none } ul.lst-kix_h9mjmxara98n-0 { list-style-type: none } ul.lst-kix_86hsx13ssqid-6 { list-style-type: none } ul.lst-kix_86hsx13ssqid-8 { list-style-type: none } ul.lst-kix_h9mjmxara98n-3 { list-style-type: none } .lst-kix_4m04az9jmmj8-8>li:before { content: "\0025a0 " } ul.lst-kix_fy6y7gyjejoh-8 { list-style-type: none } ul.lst-kix_h9mjmxara98n-4 { list-style-type: none } ul.lst-kix_h9mjmxara98n-1 { list-style-type: none } ul.lst-kix_h9mjmxara98n-2 { list-style-type: none } ul.lst-kix_h9mjmxara98n-7 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-4 { list-style-type: none } ul.lst-kix_h9mjmxara98n-8 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-5 { list-style-type: none } ul.lst-kix_h9mjmxara98n-5 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-6 { list-style-type: none } ul.lst-kix_h9mjmxara98n-6 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-7 { list-style-type: none } .lst-kix_b7256qmdgo85-6>li:before { content: "\0025cf " } ol.lst-kix_yly1729bcywk-1.start { counter-reset: lst-ctn-kix_yly1729bcywk-1 0 } ol.lst-kix_1wulu3ra2vwv-1.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-1 0 } .lst-kix_ne7nl4nhpzqr-8>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-8 } .lst-kix_q97rvvc7c69e-0>li:before { content: "\0025cf " } .lst-kix_q8ok0mh9yyto-1>li:before { content: "" counter(lst-ctn-kix_q8ok0mh9yyto-1, upper-latin) ". " } .lst-kix_4m04az9jmmj8-0>li:before { content: "\0025cf " } ol.lst-kix_11a9ub9xa97v-6.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-6 0 } .lst-kix_q8ok0mh9yyto-4>li:before { content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-4, decimal) ") " } .lst-kix_emhp84jkv42c-0>li { counter-increment: lst-ctn-kix_emhp84jkv42c-0 } .lst-kix_q8ok0mh9yyto-5>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-5 } ul.lst-kix_lemcawe54w5c-7 { list-style-type: none } ul.lst-kix_lemcawe54w5c-8 { list-style-type: none } .lst-kix_ne7nl4nhpzqr-6>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-6, decimal) ". " } ul.lst-kix_lemcawe54w5c-5 { list-style-type: none } ul.lst-kix_lemcawe54w5c-6 { list-style-type: none } ul.lst-kix_lemcawe54w5c-3 { list-style-type: none } ul.lst-kix_lemcawe54w5c-4 { list-style-type: none } ul.lst-kix_lemcawe54w5c-1 { list-style-type: none } ul.lst-kix_lemcawe54w5c-2 { list-style-type: none } .lst-kix_s3mi7ukxwiwf-1>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-1 } ul.lst-kix_lemcawe54w5c-0 { list-style-type: none } .lst-kix_4m04az9jmmj8-3>li:before { content: "\0025cf " } ul.lst-kix_f5kb4hocu5hh-4 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-3 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-6 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-5 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-8 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-7 { list-style-type: none } .lst-kix_xv318blpjdo-7>li { counter-increment: lst-ctn-kix_xv318blpjdo-7 } ol.lst-kix_xv318blpjdo-7.start { counter-reset: lst-ctn-kix_xv318blpjdo-7 0 } .lst-kix_gfromclascha-1>li:before { content: "\0025cb " } .lst-kix_86hsx13ssqid-7>li:before { content: "\0025cb " } .lst-kix_yly1729bcywk-0>li { counter-increment: lst-ctn-kix_yly1729bcywk-0 } .lst-kix_ne7nl4nhpzqr-3>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-3, decimal) ". " } ol.lst-kix_q8ok0mh9yyto-3.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-3 0 } .lst-kix_1wulu3ra2vwv-7>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-7 } ul.lst-kix_f5kb4hocu5hh-0 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-2 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-1 { list-style-type: none } ul.lst-kix_fd1rucpc9vz2-0 { list-style-type: none } .lst-kix_fy6y7gyjejoh-0>li:before { content: "\0025cf " } ul.lst-kix_fd1rucpc9vz2-1 { list-style-type: none } ul.lst-kix_fd1rucpc9vz2-2 { list-style-type: none } .lst-kix_yly1729bcywk-1>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-1, lower-latin) ". " } ul.lst-kix_fd1rucpc9vz2-3 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-6.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-6 0 } ul.lst-kix_fd1rucpc9vz2-8 { list-style-type: none } .lst-kix_pcjo479wrta-6>li:before { content: "\0025cf " } .lst-kix_bfzyeb917dp8-6>li:before { content: "(" counter(lst-ctn-kix_bfzyeb917dp8-6, lower-roman) ") " } .lst-kix_6ril5iwt0fcl-3>li:before { content: "\0025cf " } ul.lst-kix_fd1rucpc9vz2-4 { list-style-type: none } ul.lst-kix_fd1rucpc9vz2-5 { list-style-type: none } ul.lst-kix_fd1rucpc9vz2-6 { list-style-type: none } .lst-kix_fd1rucpc9vz2-6>li:before { content: "\0025cf " } ul.lst-kix_fd1rucpc9vz2-7 { list-style-type: none } .lst-kix_5anu1k9tsyak-4>li:before { content: "\0025cb " } .lst-kix_vf0l197cqv6l-7>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-7 } .lst-kix_s3mi7ukxwiwf-8>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-8 } .lst-kix_iv2x96orjh4l-4>li:before { content: "\0025cb " } .lst-kix_s3mi7ukxwiwf-6>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-6, decimal) ". " } .lst-kix_fy6y7gyjejoh-8>li:before { content: "\0025a0 " } ol.lst-kix_xv318blpjdo-4.start { counter-reset: lst-ctn-kix_xv318blpjdo-4 0 } .lst-kix_x1epm4iu41dp-1>li:before { content: "\0025cb " } .lst-kix_q97rvvc7c69e-8>li:before { content: "\0025a0 " } ol.lst-kix_xv318blpjdo-5.start { counter-reset: lst-ctn-kix_xv318blpjdo-5 0 } ul.lst-kix_8p26nc4xx5n8-0 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-1 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-2 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-3 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-4 { list-style-type: none } .lst-kix_emhp84jkv42c-0>li:before { content: "" counter(lst-ctn-kix_emhp84jkv42c-0, upper-roman) ". " } .lst-kix_emhp84jkv42c-8>li:before { content: "(" counter(lst-ctn-kix_emhp84jkv42c-8, lower-roman) ") " } .lst-kix_9jxnjym0nges-1>li:before { content: "\0025cb " } .lst-kix_xoos54gyybzj-7>li:before { content: "\0025cb " } ol.lst-kix_q8ok0mh9yyto-5.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-5 0 } .lst-kix_ndaonzmgp8vn-3>li:before { content: "\0025cf " } .lst-kix_jj5w63toozfm-8>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-8, lower-roman) ". " } .lst-kix_u0uqs69v9qbh-1>li:before { content: "\0025cb " } .lst-kix_opi66v2qdsjs-1>li:before { content: "\0025cb " } .lst-kix_lemcawe54w5c-1>li:before { content: "\0025cb " } .lst-kix_11a9ub9xa97v-7>li:before { content: "(" counter(lst-ctn-kix_11a9ub9xa97v-7, lower-latin) ") " } .lst-kix_8p26nc4xx5n8-5>li:before { content: "\0025a0 " } ol.lst-kix_xv318blpjdo-6.start { counter-reset: lst-ctn-kix_xv318blpjdo-6 0 } .lst-kix_l7z426mwssm0-7>li:before { content: "\0025cb " } .lst-kix_1wulu3ra2vwv-0>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-0 } .lst-kix_gyhqddkw9i05-5>li:before { content: "\0025a0 " } .lst-kix_hchtl271h88l-2>li:before { content: "\0025a0 " } ul.lst-kix_6qnkx7t1adn9-8 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-4.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-4 0 } ul.lst-kix_6qnkx7t1adn9-7 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-5 { list-style-type: none } ul.lst-kix_6qnkx7t1adn9-6 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-6 { list-style-type: none } ul.lst-kix_6qnkx7t1adn9-5 { list-style-type: none } .lst-kix_sholqrhc62dh-3>li:before { content: "\0025cf " } ul.lst-kix_8p26nc4xx5n8-7 { list-style-type: none } ul.lst-kix_6qnkx7t1adn9-4 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-8 { list-style-type: none } ul.lst-kix_6qnkx7t1adn9-3 { list-style-type: none } ul.lst-kix_6qnkx7t1adn9-2 { list-style-type: none } ul.lst-kix_6qnkx7t1adn9-1 { list-style-type: none } .lst-kix_1wulu3ra2vwv-1>li:before { content: "" counter(lst-ctn-kix_1wulu3ra2vwv-1, upper-latin) ". " } ul.lst-kix_6qnkx7t1adn9-0 { list-style-type: none } ol { margin: 0; padding: 0 } table td, table th { padding: 0 } .c4 { color: #ff5e0e; font-weight: 700; text-decoration: none; vertical-align: baseline; font-size: 18pt; font-family: "PT Sans Narrow"; font-style: normal } .c7 { color: #38761d; font-weight: 400; text-decoration: none; vertical-align: baseline; font-size: 16pt; font-family: "PT Sans Narrow"; font-style: normal } .c14 { color: #695d46; font-weight: 700; text-decoration: none; vertical-align: baseline; font-size: 42pt; font-family: "PT Sans Narrow"; font-style: normal } .c0 { color: #695d46; font-weight: 400; text-decoration: none; vertical-align: baseline; font-size: 11pt; font-family: "Open Sans"; font-style: normal } .c1 { padding-top: 6pt; padding-bottom: 0pt; line-height: 1.2; orphans: 2; widows: 2; text-align: left } .c8 { padding-top: 18pt; padding-bottom: 6pt; line-height: 1.2; page-break-after: avoid; text-align: left } .c11 { padding-top: 24pt; padding-bottom: 0pt; line-height: 1.3; page-break-after: avoid; text-align: left } .c17 { padding-top: 6pt; padding-bottom: 0pt; line-height: 1.2; page-break-after: avoid; text-align: left } .c19 { text-decoration: none; vertical-align: baseline; font-size: 12pt; font-style: normal } .c9 { padding-top: 16pt; padding-bottom: 0pt; line-height: 1.0; text-align: left } .c18 { padding-top: 0pt; padding-bottom: 0pt; line-height: 1.2; text-align: left } .c10 { font-size: 18pt; font-family: "PT Sans Narrow"; color: #ff5e0e; font-weight: 700 } .c13 { font-family: "Open Sans"; color: #695d46; font-weight: 400 } .c12 { background-color: #ffffff; max-width: 468pt; padding: 72pt 72pt 72pt 72pt } .c5 { padding: 0; margin: 0 } .c15 { color: inherit; text-decoration: inherit } .c16 { color: #1155cc; text-decoration: underline } .c3 { padding-left: 0pt } .c6 { margin-left: 72pt } .c2 { margin-left: 36pt } .title { padding-top: 0pt; color: #695d46; font-size: 26pt; padding-bottom: 3pt; font-family: "Open Sans"; line-height: 1.2; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } .subtitle { padding-top: 0pt; color: #666666; font-size: 15pt; padding-bottom: 16pt; font-family: "Arial"; line-height: 1.2; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } li { color: #695d46; font-size: 11pt; font-family: "Open Sans" } p { margin: 0; color: #695d46; font-size: 11pt; font-family: "Open Sans" } h1 { padding-top: 24pt; color: #ff5e0e; font-weight: 700; font-size: 18pt; padding-bottom: 0pt; font-family: "PT Sans Narrow"; line-height: 1.3; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } h2 { padding-top: 18pt; color: #38761d; font-size: 16pt; padding-bottom: 6pt; font-family: "PT Sans Narrow"; line-height: 1.2; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } h3 { padding-top: 16pt; color: #434343; font-size: 14pt; padding-bottom: 4pt; font-family: "Open Sans"; line-height: 1.2; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } h4 { padding-top: 14pt; color: #666666; font-size: 12pt; padding-bottom: 4pt; font-family: "Open Sans"; line-height: 1.2; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } h5 { padding-top: 12pt; color: #666666; font-size: 11pt; padding-bottom: 4pt; font-family: "Open Sans"; line-height: 1.2; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } h6 { padding-top: 12pt; color: #666666; font-size: 11pt; padding-bottom: 4pt; font-family: "Open Sans"; line-height: 1.2; page-break-after: avoid; font-style: italic; orphans: 2; widows: 2; text-align: left }  

Oracle Fusion Middleware Deployments Using Docker Swarm Part III

Overview

This is the third in a series of blogs that describe how to build a Fusion Middleware (FMW) Cluster that runs as a number of Docker images that run in docker containers.  These containers are coordinated using Docker Swarm and can be deployed to a single host machine or multiple hosts.  This simplifies the task of building FMW clusters and also makes it easier to scale them in and out (adding or subtracting host machines) as well as up and down (using bigger or smaller host machines).  Using docker also helps us to avoid port conflicts when running multiple servers on the same physical machine.  When we use swarm we will see that we also get benefits from a built in load balancer.

This blog uses Oracle Service Bus as an FMW product but the principles are applicable to other FMW products.

In our previous blog we talked about how to build the required docker images for running FMW on Docker Swarm and created a database container.

In this entry we will explain how to create an FMW domain image and how to run that in a docker container.  The next blog will cover how to run this in Docker Swarm.

Key Steps in Creating a Service Bus Cluster

When creating a service bus cluster we need to do the following:

  1. Create the required schemas in a database.
  • Service Bus 12.1 adds a number of new features such as re-sequencing that require the use of SOA Suite schemas.  These are in addition to the database requirements for Web Services Security Manager that existed in Service Bus 11g.
  • The Repository Creation Utility is used to create the schemas in a database.
  1. Create service bus domain.
  • The service bus domain contains all the required service bus binaries and associated configuration.  Within the domain we will create a service bus cluster.
  • The domain can be created using the WebLogic scripting tool by applying the service bus domain template.
  1. Create a Service Bus cluster within the domain.
  • The service bus cluster allows us to have multiple service bus servers running the same proxy services and sharing the load.
  • The cluster can be created and servers assigned using the WebLogic scripting tool.

These steps need to be factored into the way we build our docker images and containers and ultimately into how we create Docker Swarm services.

Mapping the Service Bus Cluster onto Docker

There are a number of ways in which we could map a Service Bus cluster onto Docker.  We have chosen the following approach:

  • Create a Docker image that contains the Service Bus domain configuration.
  • This is layered on top of the OSB installation image.  This allows us to modify and rebuild the scripts without having to reinstall the FMW software.  This speeds up the development cycle of the image.  Once the scripts are working they could be placed in the FMW binary image, reducing the number of layers.
  • When creating a container from the image we run the RCU to create the schemas in the database.  We also run scripts to create the domain and add servers to the domain as needed.
  • The same Docker image is used for both Admin and Managed Servers.
  • Depending on parameters the container decides if it is an admin server or a member of a cluster.
  • All servers need access to the database.
  • All servers need access to the Admin server.
  • The admin server requires access to all servers.
Container Summary

We effectively have two images, which are both built from multiple layers as explained previously.

  1. Database image holds the binaries for database and scripts to create a database instance.
  2. Fusion Middleware image holds the FMW binaries and scripts to create a domain, or extend an existing domain.

We have a single Docker Container to run the database from the database image.

We have multiple Docker Containers, one per managed server, to run Fusion Middleware from the single domain image.

To simplify starting the containers the git project includes run scripts (run.sh for database and runNode.sh for FMW) that can be used to create containers.

Database Container

The database container runs from the database image and has the following characteristics:

  • When the container is created it creates and starts a database instance.
  • After starting the database we change the database password.
  • When the container is stopped it shuts down the database instance.
  • When the container is started it starts the database instance.
  • The database container exposes the database port (1521 in this case)
  • Only a single container runs a given database.

The database container is started using the following command:

docker run -d -it --name Oracle12cDB --hostname osbdb -p 1521:1521 -p 5500:5500 -e ORACLE_SID=ORCL -e ORACLE_PDB=OSB -v /opt/oracle/oradata/OracleDB oracle/database:12.1.0.2-ee

We expose ports 1521 (database) and 5500 (em).

Admin Server Container

The admin server container runs from the FMW domain image, or just the FMW image if the layers have been collapsed.  It has the following characteristics:

  • When the container is created it runs the RCU to configure the database.
  • When the container is created it creates an FMW domain and cluster.
  • When the container is created it starts the Admin Server.
  • When the container is stopped its stops the Admin Server.
  • When the container is started it starts the Admin Server.
  • The Admin Server exposes the admin console port (7001 in this case)
  • Only a single Admin Server container runs in a given domain.
  • The same image is used for both Admin and Managed Servers.

We start the admin server using the following command

runNode.sh admin

This translates to

docker run -d -it \

        -e "MS_NAME=AdminServer" \

        -e "MACHINE_NAME=AdminServerMachine" \

        --name wlsadmin \

        --add-host osbdb:172.17.0.2 \

        --add-host wlsadmin:172.17.0.3 \

        --add-host wls1:172.17.0.4 \

        --add-host wls2:172.17.0.5 \

        --add-host wls3:172.17.0.6 \

        --add-host wls4:172.17.0.7 \

        --hostname wlsadmin \

        -p 7001:7001 \

        oracle/osb_domain:12.2.1.2 \

        /u01/oracle/container-scripts/createAndStartOSBDomain.sh

We need to add the hostnames of the managed servers and the database to the /etc/hosts file so that the admin server can access them.  We will show how to avoid doing this in the final blog post.

Managed Server Containers

The managed server containers runs from the same FMW domain image as the Admin Server.  It has the following characteristics:

  • When the container is created it creates a new server in the domain and adds it to the FMW cluster
  • When the container is created it creates a local copy of the domain files.
  • When the container is created it starts the Managed Server.
  • When the container is stopped its stops the Managed Server.
  • When the container is started it starts the Managed Server.
  • The Managed Server exposes the admin console port (8011 in this case)
  • Multiple Managed Server containers may run in a given domain.
  • The same image is used for both Admin and Managed Servers.

We start the managed servers using the following command

runNode.sh N

Where N is the number of the managed server.

When N=2 this  translates to

docker run -d -it \

        -e "MS_NAME=osb_server2" \

        -e "MACHINE_NAME=OsbServer2Machine" \

        --name wls2 \

        --add-host osbdb:172.17.0.2 \

        --add-host wlsadmin:172.17.0.3 \

        --add-host wls1:172.17.0.4 \

        --add-host wls2:172.17.0.5 \

        --add-host wls3:172.17.0.6 \

        --add-host wls4:172.17.0.7 \

        --hostname wlsadmin \

        -p 8013:8011 \

        oracle/osb_domain:12.2.1.2 \

        /u01/oracle/container-scripts/createAndStartOSBDomain.sh

Note that all the managed servers listen on port 8011.  Because they each run in their own container their is no conflict in their port numbers but we need to map them so that they can be accessed externally without conflicts. Special Notes for Service Bus

The first managed server in a Service Bus cluster is special because it runs singleton tasks related to reporting, collecting performance information from other nodes in the cluster and aggregating it and making it available to the console.  Because of this we decided to always create a Service Bus domain with a pre-existing single Managed Server in the cluster with the correct singleton targeting.

Because this server already exists if a container detects it is supposed to run Managed Server 1 then it does not create the server or associate it with a cluster, it justs assigns it to a machine (see next section for details) and creates the local managed server domain.

Containers and FMW Mapping

Each container maps to a single WebLogic server, either Admin Server or a Managed Server in a cluster.

The Admin Server container is responsible for running the repository configuration utility, creating the domain and configuring it for that particular FMW product (in our case Service Bus).

The Managed Server containers are responsible for adding a new Managed Server to the cluster and creating a local managed server domain.

Both Admin and Managed Server containers need to figure out key facts about themselves:

  • Hostname - used to set the listen address for the server and also the address of the machine
  • Type - admin or managed server to decide what to do on creation
  • Server identifier - managed servers need to make sure they have unique server names.
  • Associated Admin Server - managed servers must contact the admin server to obtain and update domain configuration.
  • Database Server - admin servers must know about the database to be able to run the RCU and create data sources required by the FMW product.
Starting the FMW Cluster

The FMW cluster is started as follows:

  1. A database container is created/started
  2. An admin server is created/started
  3. One or more managed servers are created/started

Containers are created using the “docker run” command.  We use the “-d” flag to run them as daemon processes.  By default the CMD directive in the dockerfile is used choose the command or script to run on container startup.  We use this for the database container.  For the admin and managed containers we identify which type of container they are and pass in an appropriate script to the “docker run” command.

Containers are started using the “docker start” command and the container uses the same command or script as when it was created.  That means we must detect if this is a new container or a container being started after previously being shutdown.  With the FMW containers we do this by looking for the existence of the domain directory, if it exists we have previously been started, if not this must be our first run.

Tools such as docker compose and docker compose simplify the task of deploying our multiple container FMW cluster and we will look at these in the next blog entry.  One of the benefits we will find with swarm is that it includes a load balancer.  The current multi-container approach would require either another container to run a load balancer or an external load balancer, we will see that swarm removes this need.

Retrieving Docker Files for OSB Cluster

We are posting all the required files to go along with this blog on github.  You are welcome to fork from this and improve it.  We cloned many of these files from the official Oracle docker github.  We removed unused versions and added a simplified build.sh file to each product directory to make it easy to see how we actually built our environment.  We are still updating the files online and will shortly add details on building the swarm services.

Summary

In this entry we have explained how to create a Fusion Middleware Domain and run it on docker containers.  In our next entry we will simplify the deploymentof of our cluster by taking advatage of swarm mode by defining swarm services for the database, WebLogic Admin Server and WebLogic managed servers.

Building an FMW Cluster using Docker (Part II Building Docker Images)

Fri, 2017-01-20 20:02

Click here for a Google Docs version of this document that doesn't suffer from the Oracle blog formatting problems

@import url('https://themes.googleusercontent.com/fonts/css?kit=cGvuclDC_Z1vE_cnVEU6AQ3B2cQio22zuQYmMduN3_mWtMd0Jq3ZhX9v3IQGKB3u249SeSIUngoluNcHmRb61Bz1ZjgTUtEb3dCu921NmgQ');.lst-kix_sholqrhc62dh-7>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-8>li:before{content:"\0025a0 "}.lst-kix_sholqrhc62dh-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-3.start{counter-reset:lst-ctn-kix_xv318blpjdo-3 0}.lst-kix_sholqrhc62dh-1>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-0>li:before{content:"\0025cf "}.lst-kix_emhp84jkv42c-3>li{counter-increment:lst-ctn-kix_emhp84jkv42c-3}.lst-kix_ekmayt81kvbz-0>li:before{content:"\0025cf "}.lst-kix_jj5w63toozfm-4>li{counter-increment:lst-ctn-kix_jj5w63toozfm-4}.lst-kix_ekmayt81kvbz-2>li:before{content:"\0025a0 "}ul.lst-kix_qeqyxe7gm97l-6{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-5{list-style-type:none}.lst-kix_ekmayt81kvbz-1>li:before{content:"\0025cb "}ul.lst-kix_qeqyxe7gm97l-4{list-style-type:none}.lst-kix_ekmayt81kvbz-3>li:before{content:"\0025cf "}ul.lst-kix_qeqyxe7gm97l-3{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-2{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-1{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-0{list-style-type:none}ol.lst-kix_11a9ub9xa97v-8.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-8 0}.lst-kix_ekmayt81kvbz-5>li:before{content:"\0025a0 "}.lst-kix_ekmayt81kvbz-7>li:before{content:"\0025cb "}ul.lst-kix_4m04az9jmmj8-3{list-style-type:none}ul.lst-kix_4m04az9jmmj8-2{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-8{list-style-type:none}ul.lst-kix_4m04az9jmmj8-1{list-style-type:none}.lst-kix_ekmayt81kvbz-4>li:before{content:"\0025cb "}.lst-kix_ekmayt81kvbz-8>li:before{content:"\0025a0 "}ul.lst-kix_qeqyxe7gm97l-7{list-style-type:none}ul.lst-kix_4m04az9jmmj8-0{list-style-type:none}ul.lst-kix_4m04az9jmmj8-7{list-style-type:none}ul.lst-kix_4m04az9jmmj8-6{list-style-type:none}ul.lst-kix_4m04az9jmmj8-5{list-style-type:none}ul.lst-kix_4m04az9jmmj8-4{list-style-type:none}.lst-kix_ekmayt81kvbz-6>li:before{content:"\0025cf "}ul.lst-kix_4m04az9jmmj8-8{list-style-type:none}.lst-kix_s3mi7ukxwiwf-2>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-2}.lst-kix_11a9ub9xa97v-0>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-0}ol.lst-kix_emhp84jkv42c-4.start{counter-reset:lst-ctn-kix_emhp84jkv42c-4 0}ol.lst-kix_xv318blpjdo-8.start{counter-reset:lst-ctn-kix_xv318blpjdo-8 0}ul.lst-kix_6ril5iwt0fcl-5{list-style-type:none}.lst-kix_q8ok0mh9yyto-8>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-8}ul.lst-kix_6ril5iwt0fcl-4{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-3{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-2{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-8{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-7{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-6{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-8.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-8 0}ul.lst-kix_6ril5iwt0fcl-1{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-0{list-style-type:none}.lst-kix_xv318blpjdo-1>li{counter-increment:lst-ctn-kix_xv318blpjdo-1}.lst-kix_bfzyeb917dp8-6>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-6}.lst-kix_s3mi7ukxwiwf-1>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-1,lower-latin) ". "}.lst-kix_gfromclascha-0>li:before{content:"\0025cf "}.lst-kix_gfromclascha-2>li:before{content:"\0025a0 "}.lst-kix_gfromclascha-4>li:before{content:"\0025cb "}ol.lst-kix_bfzyeb917dp8-7.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-7 0}.lst-kix_6ril5iwt0fcl-0>li:before{content:"\0025cf "}.lst-kix_gfromclascha-6>li:before{content:"\0025cf "}.lst-kix_q97rvvc7c69e-5>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-7>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-8.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-8 0}.lst-kix_6ril5iwt0fcl-2>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-3>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-7>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-7,lower-latin) ". "}.lst-kix_6ril5iwt0fcl-4>li:before{content:"\0025cb "}.lst-kix_6ril5iwt0fcl-6>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-8>li{counter-increment:lst-ctn-kix_xv318blpjdo-8}.lst-kix_s3mi7ukxwiwf-5>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-5,lower-roman) ". "}.lst-kix_6ril5iwt0fcl-8>li:before{content:"\0025a0 "}.lst-kix_s3mi7ukxwiwf-3>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-3,decimal) ". "}ol.lst-kix_jj5w63toozfm-7.start{counter-reset:lst-ctn-kix_jj5w63toozfm-7 0}.lst-kix_1wulu3ra2vwv-4>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-4,decimal) ") "}.lst-kix_1wulu3ra2vwv-6>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-6,lower-roman) ") "}.lst-kix_1wulu3ra2vwv-8>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-8,lower-roman) ") "}.lst-kix_gfromclascha-8>li:before{content:"\0025a0 "}.lst-kix_sholqrhc62dh-2>li:before{content:"\0025a0 "}ul.lst-kix_9jxnjym0nges-0{list-style-type:none}.lst-kix_sholqrhc62dh-4>li:before{content:"\0025cb "}.lst-kix_1wulu3ra2vwv-2>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-2,decimal) ". "}.lst-kix_1wulu3ra2vwv-0>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-0,upper-roman) ". "}ol.lst-kix_11a9ub9xa97v-3.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-3 0}.lst-kix_emhp84jkv42c-2>li{counter-increment:lst-ctn-kix_emhp84jkv42c-2}ol.lst-kix_s3mi7ukxwiwf-4.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-4 0}ul.lst-kix_h0kibz3smj6t-8{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-7.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-7 0}.lst-kix_jkgkf1u9sy0c-2>li:before{content:"\0025a0 "}.lst-kix_jkgkf1u9sy0c-1>li:before{content:"\0025cb "}ul.lst-kix_iv2x96orjh4l-2{list-style-type:none}ul.lst-kix_iv2x96orjh4l-3{list-style-type:none}ul.lst-kix_iv2x96orjh4l-0{list-style-type:none}.lst-kix_jj5w63toozfm-3>li{counter-increment:lst-ctn-kix_jj5w63toozfm-3}ul.lst-kix_iv2x96orjh4l-1{list-style-type:none}ul.lst-kix_iv2x96orjh4l-6{list-style-type:none}ul.lst-kix_iv2x96orjh4l-7{list-style-type:none}ul.lst-kix_iv2x96orjh4l-4{list-style-type:none}ul.lst-kix_iv2x96orjh4l-5{list-style-type:none}ul.lst-kix_h0kibz3smj6t-3{list-style-type:none}ul.lst-kix_h0kibz3smj6t-2{list-style-type:none}ul.lst-kix_h0kibz3smj6t-1{list-style-type:none}.lst-kix_jkgkf1u9sy0c-5>li:before{content:"\0025a0 "}ul.lst-kix_h0kibz3smj6t-0{list-style-type:none}ol.lst-kix_jj5w63toozfm-2.start{counter-reset:lst-ctn-kix_jj5w63toozfm-2 0}ul.lst-kix_h0kibz3smj6t-7{list-style-type:none}ul.lst-kix_h0kibz3smj6t-6{list-style-type:none}ul.lst-kix_h0kibz3smj6t-5{list-style-type:none}.lst-kix_jkgkf1u9sy0c-6>li:before{content:"\0025cf "}ul.lst-kix_h0kibz3smj6t-4{list-style-type:none}.lst-kix_emhp84jkv42c-4>li{counter-increment:lst-ctn-kix_emhp84jkv42c-4}ul.lst-kix_iv2x96orjh4l-8{list-style-type:none}ol.lst-kix_bfzyeb917dp8-3.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-3 0}.lst-kix_b7256qmdgo85-3>li:before{content:"\0025cf "}.lst-kix_b7256qmdgo85-4>li:before{content:"\0025cb "}.lst-kix_b7256qmdgo85-7>li:before{content:"\0025cb "}ol.lst-kix_jj5w63toozfm-3.start{counter-reset:lst-ctn-kix_jj5w63toozfm-3 0}.lst-kix_q97rvvc7c69e-2>li:before{content:"\0025a0 "}.lst-kix_b7256qmdgo85-8>li:before{content:"\0025a0 "}ol.lst-kix_bfzyeb917dp8-2.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-2 0}ol.lst-kix_1wulu3ra2vwv-6.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-6 0}.lst-kix_jj5w63toozfm-5>li{counter-increment:lst-ctn-kix_jj5w63toozfm-5}.lst-kix_s3mi7ukxwiwf-0>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-0,decimal) ". "}ul.lst-kix_q97rvvc7c69e-4{list-style-type:none}ul.lst-kix_q97rvvc7c69e-3{list-style-type:none}ul.lst-kix_q97rvvc7c69e-6{list-style-type:none}.lst-kix_s3mi7ukxwiwf-8>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-8,lower-roman) ". "}ul.lst-kix_q97rvvc7c69e-5{list-style-type:none}ul.lst-kix_q97rvvc7c69e-8{list-style-type:none}ul.lst-kix_q97rvvc7c69e-7{list-style-type:none}.lst-kix_gfromclascha-3>li:before{content:"\0025cf "}ul.lst-kix_q97rvvc7c69e-0{list-style-type:none}ul.lst-kix_q97rvvc7c69e-2{list-style-type:none}ul.lst-kix_q97rvvc7c69e-1{list-style-type:none}.lst-kix_q97rvvc7c69e-6>li:before{content:"\0025cf "}.lst-kix_6ril5iwt0fcl-1>li:before{content:"\0025cb "}.lst-kix_iv2x96orjh4l-6>li:before{content:"\0025cf "}ol.lst-kix_s3mi7ukxwiwf-3.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-3 0}.lst-kix_6ril5iwt0fcl-5>li:before{content:"\0025a0 "}.lst-kix_iv2x96orjh4l-2>li:before{content:"\0025a0 "}.lst-kix_q8ok0mh9yyto-1>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-1}.lst-kix_s3mi7ukxwiwf-4>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-4,lower-latin) ". "}.lst-kix_5anu1k9tsyak-2>li:before{content:"\0025a0 "}.lst-kix_b7256qmdgo85-0>li:before{content:"\0025cf "}.lst-kix_1wulu3ra2vwv-3>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-3,lower-latin) ") "}.lst-kix_11a9ub9xa97v-7>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-7}.lst-kix_1wulu3ra2vwv-7>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-7,lower-latin) ") "}.lst-kix_1wulu3ra2vwv-6>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-6}.lst-kix_gfromclascha-7>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-5>li:before{content:"\0025a0 "}.lst-kix_86hsx13ssqid-1>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-5>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-0>li:before{content:"\0025cf "}.lst-kix_7tib3jrzu2u9-5>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-2>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-3>li:before{content:"\0025cf "}ul.lst-kix_ndaonzmgp8vn-4{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-3{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-6{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-5{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-0{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-2{list-style-type:none}.lst-kix_bfzyeb917dp8-4>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-4}ul.lst-kix_ndaonzmgp8vn-1{list-style-type:none}.lst-kix_7tib3jrzu2u9-8>li:before{content:"\0025a0 "}ul.lst-kix_sholqrhc62dh-6{list-style-type:none}ul.lst-kix_sholqrhc62dh-5{list-style-type:none}ul.lst-kix_sholqrhc62dh-4{list-style-type:none}ul.lst-kix_sholqrhc62dh-3{list-style-type:none}ul.lst-kix_sholqrhc62dh-8{list-style-type:none}ul.lst-kix_sholqrhc62dh-7{list-style-type:none}ul.lst-kix_sholqrhc62dh-2{list-style-type:none}ol.lst-kix_bfzyeb917dp8-6.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-6 0}ul.lst-kix_sholqrhc62dh-1{list-style-type:none}ul.lst-kix_sholqrhc62dh-0{list-style-type:none}.lst-kix_emhp84jkv42c-1>li{counter-increment:lst-ctn-kix_emhp84jkv42c-1}ul.lst-kix_ndaonzmgp8vn-8{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-7{list-style-type:none}.lst-kix_j42a5dwgnqyq-8>li:before{content:"\0025a0 "}.lst-kix_5anu1k9tsyak-6>li:before{content:"\0025cf "}ol.lst-kix_bfzyeb917dp8-1.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-1 0}.lst-kix_j42a5dwgnqyq-7>li:before{content:"\0025cb "}.lst-kix_qeqyxe7gm97l-7>li:before{content:"\0025cb "}.lst-kix_qeqyxe7gm97l-8>li:before{content:"\0025a0 "}.lst-kix_5anu1k9tsyak-8>li:before{content:"\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-2.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-2 0}ul.lst-kix_686a8e4qhxwx-4{list-style-type:none}ul.lst-kix_686a8e4qhxwx-3{list-style-type:none}ul.lst-kix_686a8e4qhxwx-2{list-style-type:none}ul.lst-kix_686a8e4qhxwx-1{list-style-type:none}ul.lst-kix_686a8e4qhxwx-8{list-style-type:none}ul.lst-kix_686a8e4qhxwx-7{list-style-type:none}ul.lst-kix_686a8e4qhxwx-6{list-style-type:none}.lst-kix_6qnkx7t1adn9-0>li:before{content:"\0025cf "}.lst-kix_qeqyxe7gm97l-0>li:before{content:"\0025cf "}ul.lst-kix_686a8e4qhxwx-5{list-style-type:none}.lst-kix_6qnkx7t1adn9-1>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-3>li:before{content:"\0025cf "}ul.lst-kix_686a8e4qhxwx-0{list-style-type:none}.lst-kix_bfzyeb917dp8-0>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-0}.lst-kix_qeqyxe7gm97l-5>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-0>li:before{content:"\0025cf "}.lst-kix_j42a5dwgnqyq-2>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-5>li:before{content:"\0025a0 "}ol.lst-kix_emhp84jkv42c-3.start{counter-reset:lst-ctn-kix_emhp84jkv42c-3 0}.lst-kix_qeqyxe7gm97l-2>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-8>li{counter-increment:lst-ctn-kix_emhp84jkv42c-8}ol.lst-kix_s3mi7ukxwiwf-0.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-0 0}.lst-kix_86hsx13ssqid-8>li:before{content:"\0025a0 "}.lst-kix_s3mi7ukxwiwf-0>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-0}.lst-kix_fd1rucpc9vz2-5>li:before{content:"\0025a0 "}.lst-kix_fd1rucpc9vz2-7>li:before{content:"\0025cb "}.lst-kix_iv2x96orjh4l-5>li:before{content:"\0025a0 "}.lst-kix_iv2x96orjh4l-3>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-3>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-5>li:before{content:"\0025a0 "}.lst-kix_1wulu3ra2vwv-8>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-8}ol.lst-kix_q8ok0mh9yyto-6{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-5{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-4{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-3{list-style-type:none}.lst-kix_9jxnjym0nges-0>li:before{content:"\0025cf "}ol.lst-kix_q8ok0mh9yyto-8{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-7{list-style-type:none}ol.lst-kix_emhp84jkv42c-0.start{counter-reset:lst-ctn-kix_emhp84jkv42c-0 0}.lst-kix_opi66v2qdsjs-8>li:before{content:"\0025a0 "}.lst-kix_ndaonzmgp8vn-4>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-2{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-1{list-style-type:none}.lst-kix_9jxnjym0nges-2>li:before{content:"\0025a0 "}ol.lst-kix_q8ok0mh9yyto-0{list-style-type:none}.lst-kix_ndaonzmgp8vn-2>li:before{content:"\0025a0 "}.lst-kix_opi66v2qdsjs-2>li:before{content:"\0025a0 "}.lst-kix_11a9ub9xa97v-0>li:before{content:"" counter(lst-ctn-kix_11a9ub9xa97v-0,upper-roman) ". "}ol.lst-kix_bfzyeb917dp8-4.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-4 0}.lst-kix_q8ok0mh9yyto-3>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-3}.lst-kix_11a9ub9xa97v-8>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-8,lower-roman) ") "}.lst-kix_86hsx13ssqid-0>li:before{content:"\0025cf "}.lst-kix_86hsx13ssqid-6>li:before{content:"\0025cf "}.lst-kix_9jxnjym0nges-8>li:before{content:"\0025a0 "}.lst-kix_11a9ub9xa97v-6>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-6,lower-roman) ") "}ul.lst-kix_9jxnjym0nges-2{list-style-type:none}.lst-kix_xv318blpjdo-2>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-2,decimal) ". "}ul.lst-kix_9jxnjym0nges-1{list-style-type:none}ul.lst-kix_9jxnjym0nges-4{list-style-type:none}ul.lst-kix_9jxnjym0nges-3{list-style-type:none}.lst-kix_h0kibz3smj6t-5>li:before{content:"\0025a0 "}ul.lst-kix_9jxnjym0nges-6{list-style-type:none}ul.lst-kix_9jxnjym0nges-5{list-style-type:none}ul.lst-kix_9jxnjym0nges-8{list-style-type:none}ul.lst-kix_9jxnjym0nges-7{list-style-type:none}.lst-kix_xv318blpjdo-2>li{counter-increment:lst-ctn-kix_xv318blpjdo-2}.lst-kix_s3mi7ukxwiwf-3>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-3}.lst-kix_bfzyeb917dp8-7>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-7}ol.lst-kix_emhp84jkv42c-1.start{counter-reset:lst-ctn-kix_emhp84jkv42c-1 0}.lst-kix_jkgkf1u9sy0c-4>li:before{content:"\0025cb "}ol.lst-kix_jj5w63toozfm-3{list-style-type:none}ol.lst-kix_jj5w63toozfm-4{list-style-type:none}ol.lst-kix_jj5w63toozfm-5{list-style-type:none}.lst-kix_jkgkf1u9sy0c-7>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-7>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-7,lower-latin) ") "}.lst-kix_686a8e4qhxwx-5>li:before{content:"\0025a0 "}ol.lst-kix_jj5w63toozfm-6{list-style-type:none}ol.lst-kix_jj5w63toozfm-7{list-style-type:none}ol.lst-kix_jj5w63toozfm-8{list-style-type:none}.lst-kix_h0kibz3smj6t-2>li:before{content:"\0025a0 "}.lst-kix_q8ok0mh9yyto-7>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-7}ol.lst-kix_jj5w63toozfm-0{list-style-type:none}ol.lst-kix_jj5w63toozfm-1{list-style-type:none}.lst-kix_686a8e4qhxwx-2>li:before{content:"\0025a0 "}ol.lst-kix_jj5w63toozfm-2{list-style-type:none}ol.lst-kix_11a9ub9xa97v-3{list-style-type:none}ol.lst-kix_bfzyeb917dp8-8.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-8 0}ol.lst-kix_11a9ub9xa97v-2{list-style-type:none}ol.lst-kix_11a9ub9xa97v-1{list-style-type:none}ol.lst-kix_11a9ub9xa97v-0{list-style-type:none}.lst-kix_b7256qmdgo85-2>li:before{content:"\0025a0 "}ol.lst-kix_11a9ub9xa97v-8{list-style-type:none}ol.lst-kix_11a9ub9xa97v-7{list-style-type:none}ol.lst-kix_11a9ub9xa97v-6{list-style-type:none}ol.lst-kix_11a9ub9xa97v-5{list-style-type:none}.lst-kix_4m04az9jmmj8-7>li:before{content:"\0025cb "}ol.lst-kix_11a9ub9xa97v-4{list-style-type:none}.lst-kix_b7256qmdgo85-5>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-1>li:before{content:"\0025cb "}.lst-kix_q8ok0mh9yyto-5>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-5,lower-latin) ") "}.lst-kix_4m04az9jmmj8-4>li:before{content:"\0025cb "}.lst-kix_bfzyeb917dp8-3>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-3}.lst-kix_q8ok0mh9yyto-8>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-8,lower-roman) ") "}ol.lst-kix_bfzyeb917dp8-5{list-style-type:none}ol.lst-kix_bfzyeb917dp8-4{list-style-type:none}ol.lst-kix_bfzyeb917dp8-3{list-style-type:none}ol.lst-kix_bfzyeb917dp8-2{list-style-type:none}ol.lst-kix_bfzyeb917dp8-8{list-style-type:none}ol.lst-kix_bfzyeb917dp8-7{list-style-type:none}ol.lst-kix_bfzyeb917dp8-6{list-style-type:none}ol.lst-kix_bfzyeb917dp8-1{list-style-type:none}ol.lst-kix_bfzyeb917dp8-0{list-style-type:none}ol.lst-kix_emhp84jkv42c-5.start{counter-reset:lst-ctn-kix_emhp84jkv42c-5 0}.lst-kix_q8ok0mh9yyto-0>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-0}.lst-kix_iv2x96orjh4l-8>li:before{content:"\0025a0 "}.lst-kix_6qnkx7t1adn9-6>li:before{content:"\0025cf "}.lst-kix_gfromclascha-5>li:before{content:"\0025a0 "}ol.lst-kix_emhp84jkv42c-8.start{counter-reset:lst-ctn-kix_emhp84jkv42c-8 0}.lst-kix_11a9ub9xa97v-8>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-8}.lst-kix_x1epm4iu41dp-5>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-4>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-5>li{counter-increment:lst-ctn-kix_xv318blpjdo-5}.lst-kix_1wulu3ra2vwv-5>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-5}.lst-kix_5anu1k9tsyak-0>li:before{content:"\0025cf "}.lst-kix_fy6y7gyjejoh-4>li:before{content:"\0025cb "}.lst-kix_ndaonzmgp8vn-7>li:before{content:"\0025cb "}.lst-kix_iv2x96orjh4l-0>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-2>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-2,lower-roman) ". "}.lst-kix_6ril5iwt0fcl-7>li:before{content:"\0025cb "}.lst-kix_emhp84jkv42c-4>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-4,decimal) ") "}.lst-kix_emhp84jkv42c-5>li{counter-increment:lst-ctn-kix_emhp84jkv42c-5}.lst-kix_jj5w63toozfm-4>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-4,lower-latin) ". "}.lst-kix_1wulu3ra2vwv-5>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-5,lower-latin) ") "}ul.lst-kix_u0uqs69v9qbh-8{list-style-type:none}.lst-kix_11a9ub9xa97v-1>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-1}ul.lst-kix_u0uqs69v9qbh-4{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-5{list-style-type:none}.lst-kix_opi66v2qdsjs-5>li:before{content:"\0025a0 "}ul.lst-kix_u0uqs69v9qbh-6{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-7{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-0{list-style-type:none}ul.lst-kix_gyhqddkw9i05-6{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-1{list-style-type:none}ul.lst-kix_gyhqddkw9i05-5{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-2{list-style-type:none}ul.lst-kix_gyhqddkw9i05-8{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-3{list-style-type:none}ul.lst-kix_gyhqddkw9i05-7{list-style-type:none}ol.lst-kix_emhp84jkv42c-7.start{counter-reset:lst-ctn-kix_emhp84jkv42c-7 0}.lst-kix_fd1rucpc9vz2-2>li:before{content:"\0025a0 "}ul.lst-kix_jkgkf1u9sy0c-4{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-5{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-6{list-style-type:none}ul.lst-kix_gyhqddkw9i05-0{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-7{list-style-type:none}.lst-kix_bfzyeb917dp8-2>li:before{content:"" counter(lst-ctn-kix_bfzyeb917dp8-2,decimal) ". "}.lst-kix_gyhqddkw9i05-1>li:before{content:"\0025cb "}ul.lst-kix_jkgkf1u9sy0c-8{list-style-type:none}ul.lst-kix_gyhqddkw9i05-2{list-style-type:none}ul.lst-kix_gyhqddkw9i05-1{list-style-type:none}ul.lst-kix_gyhqddkw9i05-4{list-style-type:none}ul.lst-kix_gyhqddkw9i05-3{list-style-type:none}.lst-kix_11a9ub9xa97v-3>li:before{content:"" counter(lst-ctn-kix_11a9ub9xa97v-3,lower-latin) ") "}ol.lst-kix_emhp84jkv42c-6.start{counter-reset:lst-ctn-kix_emhp84jkv42c-6 0}.lst-kix_8p26nc4xx5n8-1>li:before{content:"\0025cb "}.lst-kix_u0uqs69v9qbh-5>li:before{content:"\0025a0 "}.lst-kix_9jxnjym0nges-5>li:before{content:"\0025a0 "}.lst-kix_86hsx13ssqid-3>li:before{content:"\0025cf "}ul.lst-kix_jkgkf1u9sy0c-0{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-1{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-2{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-3{list-style-type:none}ol.lst-kix_jj5w63toozfm-5.start{counter-reset:lst-ctn-kix_jj5w63toozfm-5 0}ul.lst-kix_bijol4nzhwf0-8{list-style-type:none}ol.lst-kix_emhp84jkv42c-0{list-style-type:none}ol.lst-kix_emhp84jkv42c-2{list-style-type:none}ol.lst-kix_emhp84jkv42c-1{list-style-type:none}ol.lst-kix_emhp84jkv42c-4{list-style-type:none}ol.lst-kix_emhp84jkv42c-3{list-style-type:none}ol.lst-kix_emhp84jkv42c-6{list-style-type:none}ol.lst-kix_emhp84jkv42c-5{list-style-type:none}ol.lst-kix_emhp84jkv42c-8{list-style-type:none}ol.lst-kix_emhp84jkv42c-7{list-style-type:none}.lst-kix_11a9ub9xa97v-4>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-4}.lst-kix_1qz6dmm9b14l-4>li:before{content:"\0025cb "}.lst-kix_1qz6dmm9b14l-3>li:before{content:"\0025cf "}.lst-kix_1qz6dmm9b14l-5>li:before{content:"\0025a0 "}ul.lst-kix_j42a5dwgnqyq-0{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-1{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-2{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-3{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-4{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-5{list-style-type:none}.lst-kix_1qz6dmm9b14l-0>li:before{content:"\0025cf "}.lst-kix_1qz6dmm9b14l-8>li:before{content:"\0025a0 "}ul.lst-kix_j42a5dwgnqyq-6{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-7{list-style-type:none}.lst-kix_1qz6dmm9b14l-1>li:before{content:"\0025cb "}ol.lst-kix_bfzyeb917dp8-0.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-0 0}ul.lst-kix_j42a5dwgnqyq-8{list-style-type:none}.lst-kix_1qz6dmm9b14l-2>li:before{content:"\0025a0 "}ul.lst-kix_bijol4nzhwf0-4{list-style-type:none}ul.lst-kix_bijol4nzhwf0-5{list-style-type:none}ul.lst-kix_bijol4nzhwf0-6{list-style-type:none}ul.lst-kix_bijol4nzhwf0-7{list-style-type:none}ul.lst-kix_bijol4nzhwf0-0{list-style-type:none}ul.lst-kix_bijol4nzhwf0-1{list-style-type:none}ul.lst-kix_bijol4nzhwf0-2{list-style-type:none}ul.lst-kix_bijol4nzhwf0-3{list-style-type:none}.lst-kix_jj5w63toozfm-3>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-3,decimal) ". "}.lst-kix_1wulu3ra2vwv-2>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-2}.lst-kix_1qz6dmm9b14l-7>li:before{content:"\0025cb "}.lst-kix_jj5w63toozfm-2>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-2,lower-roman) ". "}.lst-kix_q8ok0mh9yyto-4>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-4}.lst-kix_1qz6dmm9b14l-6>li:before{content:"\0025cf "}.lst-kix_jj5w63toozfm-1>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-1,lower-latin) ". "}.lst-kix_h9mjmxara98n-7>li:before{content:"\0025cb "}.lst-kix_bijol4nzhwf0-7>li:before{content:"\0025cb "}.lst-kix_jj5w63toozfm-0>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-0,decimal) ". "}.lst-kix_h9mjmxara98n-6>li:before{content:"\0025cf "}.lst-kix_h9mjmxara98n-8>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-6>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-8>li:before{content:"\0025a0 "}.lst-kix_h9mjmxara98n-5>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-5>li:before{content:"\0025a0 "}.lst-kix_h9mjmxara98n-3>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-3>li:before{content:"\0025cf "}.lst-kix_h9mjmxara98n-2>li:before{content:"\0025a0 "}.lst-kix_h9mjmxara98n-4>li:before{content:"\0025cb "}.lst-kix_bijol4nzhwf0-2>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-4>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-1.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-1 0}ol.lst-kix_s3mi7ukxwiwf-1.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-1 0}.lst-kix_h9mjmxara98n-0>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-0>li:before{content:"\0025cf "}.lst-kix_h9mjmxara98n-1>li:before{content:"\0025cb "}.lst-kix_bijol4nzhwf0-1>li:before{content:"\0025cb "}.lst-kix_jj5w63toozfm-8>li{counter-increment:lst-ctn-kix_jj5w63toozfm-8}ul.lst-kix_gfromclascha-0{list-style-type:none}ol.lst-kix_emhp84jkv42c-2.start{counter-reset:lst-ctn-kix_emhp84jkv42c-2 0}ul.lst-kix_gfromclascha-7{list-style-type:none}ul.lst-kix_gfromclascha-8{list-style-type:none}ul.lst-kix_gfromclascha-5{list-style-type:none}ul.lst-kix_gfromclascha-6{list-style-type:none}.lst-kix_x1epm4iu41dp-8>li:before{content:"\0025a0 "}ul.lst-kix_gfromclascha-3{list-style-type:none}ul.lst-kix_gfromclascha-4{list-style-type:none}ul.lst-kix_gfromclascha-1{list-style-type:none}.lst-kix_bfzyeb917dp8-3>li:before{content:"" counter(lst-ctn-kix_bfzyeb917dp8-3,lower-latin) ") "}ul.lst-kix_gfromclascha-2{list-style-type:none}ul.lst-kix_opi66v2qdsjs-3{list-style-type:none}.lst-kix_x1epm4iu41dp-2>li:before{content:"\0025a0 "}ol.lst-kix_11a9ub9xa97v-1.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-1 0}ul.lst-kix_opi66v2qdsjs-2{list-style-type:none}ul.lst-kix_opi66v2qdsjs-1{list-style-type:none}ul.lst-kix_opi66v2qdsjs-0{list-style-type:none}.lst-kix_q8ok0mh9yyto-0>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-0,upper-roman) ". "}.lst-kix_fy6y7gyjejoh-3>li:before{content:"\0025cf "}.lst-kix_bfzyeb917dp8-5>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-5,lower-latin) ") "}.lst-kix_jj5w63toozfm-0>li{counter-increment:lst-ctn-kix_jj5w63toozfm-0}.lst-kix_x1epm4iu41dp-6>li:before{content:"\0025cf "}ul.lst-kix_opi66v2qdsjs-8{list-style-type:none}ul.lst-kix_opi66v2qdsjs-7{list-style-type:none}.lst-kix_x1epm4iu41dp-4>li:before{content:"\0025cb "}ul.lst-kix_opi66v2qdsjs-6{list-style-type:none}ul.lst-kix_opi66v2qdsjs-5{list-style-type:none}.lst-kix_fy6y7gyjejoh-1>li:before{content:"\0025cb "}ul.lst-kix_opi66v2qdsjs-4{list-style-type:none}.lst-kix_bfzyeb917dp8-7>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-7,lower-latin) ") "}.lst-kix_emhp84jkv42c-7>li{counter-increment:lst-ctn-kix_emhp84jkv42c-7}.lst-kix_fy6y7gyjejoh-7>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-1.start{counter-reset:lst-ctn-kix_xv318blpjdo-1 0}.lst-kix_x1epm4iu41dp-0>li:before{content:"\0025cf "}.lst-kix_fy6y7gyjejoh-5>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-3>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-3,lower-latin) ") "}.lst-kix_emhp84jkv42c-5>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-5,lower-latin) ") "}.lst-kix_emhp84jkv42c-1>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-1,upper-latin) ". "}.lst-kix_emhp84jkv42c-7>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-7,lower-latin) ") "}.lst-kix_jj5w63toozfm-5>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-5,lower-roman) ". "}.lst-kix_bfzyeb917dp8-2>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-2}ul.lst-kix_1qz6dmm9b14l-6{list-style-type:none}.lst-kix_gyhqddkw9i05-8>li:before{content:"\0025a0 "}.lst-kix_jj5w63toozfm-7>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-7,lower-latin) ". "}ul.lst-kix_1qz6dmm9b14l-5{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-8{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-7{list-style-type:none}.lst-kix_jj5w63toozfm-1>li{counter-increment:lst-ctn-kix_jj5w63toozfm-1}ul.lst-kix_1qz6dmm9b14l-2{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-1{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-4{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-3{list-style-type:none}.lst-kix_u0uqs69v9qbh-0>li:before{content:"\0025cf "}.lst-kix_u0uqs69v9qbh-4>li:before{content:"\0025cb "}ul.lst-kix_1qz6dmm9b14l-0{list-style-type:none}.lst-kix_s3mi7ukxwiwf-6>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-6}.lst-kix_jj5w63toozfm-7>li{counter-increment:lst-ctn-kix_jj5w63toozfm-7}.lst-kix_u0uqs69v9qbh-2>li:before{content:"\0025a0 "}.lst-kix_8p26nc4xx5n8-6>li:before{content:"\0025cf "}ol.lst-kix_1wulu3ra2vwv-4.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-4 0}.lst-kix_u0uqs69v9qbh-8>li:before{content:"\0025a0 "}.lst-kix_bfzyeb917dp8-1>li:before{content:"" counter(lst-ctn-kix_bfzyeb917dp8-1,upper-latin) ". "}ul.lst-kix_ekmayt81kvbz-8{list-style-type:none}.lst-kix_gyhqddkw9i05-0>li:before{content:"\0025cf "}ul.lst-kix_ekmayt81kvbz-7{list-style-type:none}.lst-kix_gyhqddkw9i05-4>li:before{content:"\0025cb "}.lst-kix_8p26nc4xx5n8-2>li:before{content:"\0025a0 "}ul.lst-kix_ekmayt81kvbz-6{list-style-type:none}ul.lst-kix_ekmayt81kvbz-5{list-style-type:none}ul.lst-kix_ekmayt81kvbz-4{list-style-type:none}ul.lst-kix_ekmayt81kvbz-3{list-style-type:none}.lst-kix_gyhqddkw9i05-6>li:before{content:"\0025cf "}.lst-kix_8p26nc4xx5n8-0>li:before{content:"\0025cf "}.lst-kix_8p26nc4xx5n8-8>li:before{content:"\0025a0 "}ul.lst-kix_ekmayt81kvbz-2{list-style-type:none}ul.lst-kix_ekmayt81kvbz-1{list-style-type:none}.lst-kix_u0uqs69v9qbh-6>li:before{content:"\0025cf "}ul.lst-kix_ekmayt81kvbz-0{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-1{list-style-type:none}ol.lst-kix_bfzyeb917dp8-5.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-5 0}ol.lst-kix_s3mi7ukxwiwf-2{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-0{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-1{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-5{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-2{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-6{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-3{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-0{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-4{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-5{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-6{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-3{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-7{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-4{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-8{list-style-type:none}.lst-kix_gyhqddkw9i05-2>li:before{content:"\0025a0 "}.lst-kix_8p26nc4xx5n8-4>li:before{content:"\0025cb "}ul.lst-kix_7tib3jrzu2u9-7{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-8{list-style-type:none}.lst-kix_xv318blpjdo-1>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-1,upper-latin) ". "}.lst-kix_xv318blpjdo-0>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-0,upper-roman) ". "}.lst-kix_h0kibz3smj6t-4>li:before{content:"\0025cb "}.lst-kix_1wulu3ra2vwv-1>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-1}.lst-kix_h0kibz3smj6t-7>li:before{content:"\0025cb "}.lst-kix_h0kibz3smj6t-8>li:before{content:"\0025a0 "}.lst-kix_11a9ub9xa97v-5>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-5}.lst-kix_opi66v2qdsjs-0>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-7>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-8>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-8,lower-roman) ") "}.lst-kix_xv318blpjdo-5>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-5,lower-latin) ") "}.lst-kix_h0kibz3smj6t-3>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-3>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-4>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-4>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-4,decimal) ") "}.lst-kix_h0kibz3smj6t-0>li:before{content:"\0025cf "}ol.lst-kix_11a9ub9xa97v-0.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-0 0}.lst-kix_s3mi7ukxwiwf-7>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-7}.lst-kix_q8ok0mh9yyto-3>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-3,lower-latin) ") "}.lst-kix_686a8e4qhxwx-8>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-6>li{counter-increment:lst-ctn-kix_emhp84jkv42c-6}.lst-kix_q8ok0mh9yyto-2>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-2,decimal) ". "}.lst-kix_q8ok0mh9yyto-6>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-6,lower-roman) ") "}.lst-kix_4m04az9jmmj8-2>li:before{content:"\0025a0 "}.lst-kix_4m04az9jmmj8-6>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-7>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-7,lower-latin) ") "}.lst-kix_4m04az9jmmj8-1>li:before{content:"\0025cb "}.lst-kix_4m04az9jmmj8-5>li:before{content:"\0025a0 "}.lst-kix_xv318blpjdo-4>li{counter-increment:lst-ctn-kix_xv318blpjdo-4}.lst-kix_x1epm4iu41dp-7>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-4>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-8>li:before{content:"\0025a0 "}.lst-kix_xv318blpjdo-6>li{counter-increment:lst-ctn-kix_xv318blpjdo-6}ol.lst-kix_jj5w63toozfm-1.start{counter-reset:lst-ctn-kix_jj5w63toozfm-1 0}.lst-kix_bfzyeb917dp8-4>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-4,decimal) ") "}.lst-kix_x1epm4iu41dp-3>li:before{content:"\0025cf "}.lst-kix_fd1rucpc9vz2-8>li:before{content:"\0025a0 "}.lst-kix_bfzyeb917dp8-8>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-8,lower-roman) ") "}.lst-kix_fy6y7gyjejoh-2>li:before{content:"\0025a0 "}.lst-kix_fy6y7gyjejoh-6>li:before{content:"\0025cf "}ol.lst-kix_1wulu3ra2vwv-8.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-8 0}ol.lst-kix_s3mi7ukxwiwf-6.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-6 0}ol.lst-kix_jj5w63toozfm-0.start{counter-reset:lst-ctn-kix_jj5w63toozfm-0 0}.lst-kix_emhp84jkv42c-2>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-2,decimal) ". "}.lst-kix_emhp84jkv42c-6>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-6,lower-roman) ") "}.lst-kix_686a8e4qhxwx-0>li:before{content:"\0025cf "}.lst-kix_ndaonzmgp8vn-5>li:before{content:"\0025a0 "}.lst-kix_9jxnjym0nges-3>li:before{content:"\0025cf "}.lst-kix_opi66v2qdsjs-7>li:before{content:"\0025cb "}.lst-kix_ndaonzmgp8vn-1>li:before{content:"\0025cb "}.lst-kix_gyhqddkw9i05-7>li:before{content:"\0025cb "}.lst-kix_jj5w63toozfm-6>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-6,decimal) ". "}.lst-kix_u0uqs69v9qbh-3>li:before{content:"\0025cf "}.lst-kix_fd1rucpc9vz2-0>li:before{content:"\0025cf "}.lst-kix_fd1rucpc9vz2-4>li:before{content:"\0025cb "}ol.lst-kix_s3mi7ukxwiwf-5.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-5 0}.lst-kix_opi66v2qdsjs-3>li:before{content:"\0025cf "}.lst-kix_8p26nc4xx5n8-3>li:before{content:"\0025cf "}.lst-kix_8p26nc4xx5n8-7>li:before{content:"\0025cb "}.lst-kix_u0uqs69v9qbh-7>li:before{content:"\0025cb "}.lst-kix_bfzyeb917dp8-0>li:before{content:"" counter(lst-ctn-kix_bfzyeb917dp8-0,upper-roman) ". "}.lst-kix_11a9ub9xa97v-1>li:before{content:"" counter(lst-ctn-kix_11a9ub9xa97v-1,upper-latin) ". "}.lst-kix_gyhqddkw9i05-3>li:before{content:"\0025cf "}.lst-kix_9jxnjym0nges-7>li:before{content:"\0025cb "}.lst-kix_11a9ub9xa97v-5>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-5,lower-latin) ") "}ol.lst-kix_11a9ub9xa97v-2.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-2 0}.lst-kix_s3mi7ukxwiwf-4>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-4}.lst-kix_7tib3jrzu2u9-4>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-4{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-7.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-7 0}ol.lst-kix_xv318blpjdo-5{list-style-type:none}ol.lst-kix_xv318blpjdo-6{list-style-type:none}ol.lst-kix_xv318blpjdo-7{list-style-type:none}ol.lst-kix_xv318blpjdo-0{list-style-type:none}ol.lst-kix_xv318blpjdo-1{list-style-type:none}.lst-kix_7tib3jrzu2u9-1>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-2{list-style-type:none}ol.lst-kix_xv318blpjdo-3{list-style-type:none}.lst-kix_q8ok0mh9yyto-6>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-6}ul.lst-kix_5anu1k9tsyak-7{list-style-type:none}.lst-kix_jj5w63toozfm-6>li{counter-increment:lst-ctn-kix_jj5w63toozfm-6}ul.lst-kix_5anu1k9tsyak-8{list-style-type:none}ul.lst-kix_5anu1k9tsyak-5{list-style-type:none}.lst-kix_11a9ub9xa97v-2>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-2}ol.lst-kix_1wulu3ra2vwv-0{list-style-type:none}ul.lst-kix_5anu1k9tsyak-6{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-1{list-style-type:none}ul.lst-kix_5anu1k9tsyak-3{list-style-type:none}ul.lst-kix_5anu1k9tsyak-4{list-style-type:none}ul.lst-kix_5anu1k9tsyak-1{list-style-type:none}.lst-kix_xv318blpjdo-3>li{counter-increment:lst-ctn-kix_xv318blpjdo-3}ul.lst-kix_5anu1k9tsyak-2{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-6{list-style-type:none}ul.lst-kix_5anu1k9tsyak-0{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-7{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-8{list-style-type:none}.lst-kix_7tib3jrzu2u9-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-8{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-2{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-3{list-style-type:none}.lst-kix_7tib3jrzu2u9-7>li:before{content:"\0025cb "}ol.lst-kix_1wulu3ra2vwv-4{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-5{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-5.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-5 0}ol.lst-kix_11a9ub9xa97v-7.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-7 0}ol.lst-kix_q8ok0mh9yyto-2.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-2 0}.lst-kix_11a9ub9xa97v-6>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-6}.lst-kix_5anu1k9tsyak-7>li:before{content:"\0025cb "}.lst-kix_j42a5dwgnqyq-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-2.start{counter-reset:lst-ctn-kix_xv318blpjdo-2 0}.lst-kix_1wulu3ra2vwv-4>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-4}.lst-kix_q8ok0mh9yyto-2>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-2}ol.lst-kix_jj5w63toozfm-4.start{counter-reset:lst-ctn-kix_jj5w63toozfm-4 0}.lst-kix_6qnkx7t1adn9-2>li:before{content:"\0025a0 "}.lst-kix_qeqyxe7gm97l-6>li:before{content:"\0025cf "}.lst-kix_qeqyxe7gm97l-4>li:before{content:"\0025cb "}.lst-kix_j42a5dwgnqyq-1>li:before{content:"\0025cb "}.lst-kix_qeqyxe7gm97l-1>li:before{content:"\0025cb "}.lst-kix_qeqyxe7gm97l-3>li:before{content:"\0025cf "}.lst-kix_j42a5dwgnqyq-4>li:before{content:"\0025cb "}ol.lst-kix_1wulu3ra2vwv-0.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-0 0}ol.lst-kix_q8ok0mh9yyto-7.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-7 0}.lst-kix_j42a5dwgnqyq-3>li:before{content:"\0025cf "}.lst-kix_jj5w63toozfm-2>li{counter-increment:lst-ctn-kix_jj5w63toozfm-2}ol.lst-kix_1wulu3ra2vwv-3.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-3 0}ol.lst-kix_q8ok0mh9yyto-0.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-0 0}.lst-kix_6qnkx7t1adn9-5>li:before{content:"\0025a0 "}.lst-kix_6qnkx7t1adn9-7>li:before{content:"\0025cb "}.lst-kix_iv2x96orjh4l-7>li:before{content:"\0025cb "}.lst-kix_ndaonzmgp8vn-6>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-1>li:before{content:"\0025cb "}.lst-kix_ndaonzmgp8vn-8>li:before{content:"\0025a0 "}.lst-kix_iv2x96orjh4l-1>li:before{content:"\0025cb "}.lst-kix_bfzyeb917dp8-8>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-8}.lst-kix_opi66v2qdsjs-4>li:before{content:"\0025cb "}.lst-kix_fd1rucpc9vz2-1>li:before{content:"\0025cb "}.lst-kix_fd1rucpc9vz2-3>li:before{content:"\0025cf "}.lst-kix_opi66v2qdsjs-6>li:before{content:"\0025cf "}ol.lst-kix_11a9ub9xa97v-4.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-4 0}.lst-kix_bfzyeb917dp8-1>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-1}.lst-kix_ndaonzmgp8vn-0>li:before{content:"\0025cf "}ol.lst-kix_jj5w63toozfm-6.start{counter-reset:lst-ctn-kix_jj5w63toozfm-6 0}ul.lst-kix_b7256qmdgo85-6{list-style-type:none}ul.lst-kix_b7256qmdgo85-7{list-style-type:none}.lst-kix_1wulu3ra2vwv-3>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-3}ul.lst-kix_b7256qmdgo85-8{list-style-type:none}ul.lst-kix_b7256qmdgo85-2{list-style-type:none}ul.lst-kix_b7256qmdgo85-3{list-style-type:none}.lst-kix_11a9ub9xa97v-4>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-4,decimal) ") "}ul.lst-kix_b7256qmdgo85-4{list-style-type:none}ul.lst-kix_b7256qmdgo85-5{list-style-type:none}.lst-kix_11a9ub9xa97v-2>li:before{content:"" counter(lst-ctn-kix_11a9ub9xa97v-2,decimal) ". "}.lst-kix_9jxnjym0nges-4>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-4>li:before{content:"\0025cb "}ul.lst-kix_b7256qmdgo85-0{list-style-type:none}ul.lst-kix_b7256qmdgo85-1{list-style-type:none}.lst-kix_9jxnjym0nges-6>li:before{content:"\0025cf "}.lst-kix_86hsx13ssqid-2>li:before{content:"\0025a0 "}.lst-kix_bfzyeb917dp8-5>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-5}.lst-kix_h0kibz3smj6t-6>li:before{content:"\0025cf "}.lst-kix_11a9ub9xa97v-3>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-3}ol.lst-kix_11a9ub9xa97v-5.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-5 0}ul.lst-kix_x1epm4iu41dp-0{list-style-type:none}ol.lst-kix_xv318blpjdo-0.start{counter-reset:lst-ctn-kix_xv318blpjdo-0 0}.lst-kix_jkgkf1u9sy0c-0>li:before{content:"\0025cf "}ul.lst-kix_x1epm4iu41dp-6{list-style-type:none}ul.lst-kix_x1epm4iu41dp-5{list-style-type:none}ul.lst-kix_x1epm4iu41dp-8{list-style-type:none}.lst-kix_jkgkf1u9sy0c-3>li:before{content:"\0025cf "}ul.lst-kix_x1epm4iu41dp-7{list-style-type:none}ul.lst-kix_x1epm4iu41dp-2{list-style-type:none}.lst-kix_xv318blpjdo-0>li{counter-increment:lst-ctn-kix_xv318blpjdo-0}ol.lst-kix_jj5w63toozfm-8.start{counter-reset:lst-ctn-kix_jj5w63toozfm-8 0}ul.lst-kix_x1epm4iu41dp-1{list-style-type:none}ul.lst-kix_x1epm4iu41dp-4{list-style-type:none}ul.lst-kix_x1epm4iu41dp-3{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-2.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-2 0}.lst-kix_686a8e4qhxwx-6>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-5>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-5}.lst-kix_h0kibz3smj6t-1>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-6>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-6,lower-roman) ") "}ul.lst-kix_86hsx13ssqid-3{list-style-type:none}ul.lst-kix_86hsx13ssqid-2{list-style-type:none}.lst-kix_xv318blpjdo-3>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-3,lower-latin) ") "}ul.lst-kix_86hsx13ssqid-5{list-style-type:none}ul.lst-kix_86hsx13ssqid-4{list-style-type:none}.lst-kix_686a8e4qhxwx-1>li:before{content:"\0025cb "}ul.lst-kix_86hsx13ssqid-1{list-style-type:none}.lst-kix_jkgkf1u9sy0c-8>li:before{content:"\0025a0 "}ul.lst-kix_86hsx13ssqid-0{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-0{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-1{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-2{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-3{list-style-type:none}.lst-kix_b7256qmdgo85-1>li:before{content:"\0025cb "}ul.lst-kix_86hsx13ssqid-7{list-style-type:none}ul.lst-kix_h9mjmxara98n-0{list-style-type:none}ul.lst-kix_86hsx13ssqid-6{list-style-type:none}ul.lst-kix_86hsx13ssqid-8{list-style-type:none}ul.lst-kix_h9mjmxara98n-3{list-style-type:none}.lst-kix_4m04az9jmmj8-8>li:before{content:"\0025a0 "}ul.lst-kix_fy6y7gyjejoh-8{list-style-type:none}ul.lst-kix_h9mjmxara98n-4{list-style-type:none}ul.lst-kix_h9mjmxara98n-1{list-style-type:none}ul.lst-kix_h9mjmxara98n-2{list-style-type:none}ul.lst-kix_h9mjmxara98n-7{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-4{list-style-type:none}ul.lst-kix_h9mjmxara98n-8{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-5{list-style-type:none}ul.lst-kix_h9mjmxara98n-5{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-6{list-style-type:none}ul.lst-kix_h9mjmxara98n-6{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-7{list-style-type:none}.lst-kix_b7256qmdgo85-6>li:before{content:"\0025cf "}ol.lst-kix_1wulu3ra2vwv-1.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-1 0}.lst-kix_q97rvvc7c69e-0>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-1>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-1,upper-latin) ". "}.lst-kix_4m04az9jmmj8-0>li:before{content:"\0025cf "}ol.lst-kix_11a9ub9xa97v-6.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-6 0}.lst-kix_q8ok0mh9yyto-4>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-4,decimal) ") "}.lst-kix_emhp84jkv42c-0>li{counter-increment:lst-ctn-kix_emhp84jkv42c-0}.lst-kix_q8ok0mh9yyto-5>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-5}.lst-kix_s3mi7ukxwiwf-1>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-1}.lst-kix_4m04az9jmmj8-3>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-7>li{counter-increment:lst-ctn-kix_xv318blpjdo-7}ol.lst-kix_xv318blpjdo-7.start{counter-reset:lst-ctn-kix_xv318blpjdo-7 0}.lst-kix_gfromclascha-1>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-7>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-3.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-3 0}.lst-kix_1wulu3ra2vwv-7>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-7}ul.lst-kix_fd1rucpc9vz2-0{list-style-type:none}.lst-kix_fy6y7gyjejoh-0>li:before{content:"\0025cf "}ul.lst-kix_fd1rucpc9vz2-1{list-style-type:none}ul.lst-kix_fd1rucpc9vz2-2{list-style-type:none}ul.lst-kix_fd1rucpc9vz2-3{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-6.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-6 0}ul.lst-kix_fd1rucpc9vz2-8{list-style-type:none}.lst-kix_bfzyeb917dp8-6>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-6,lower-roman) ") "}.lst-kix_6ril5iwt0fcl-3>li:before{content:"\0025cf "}ul.lst-kix_fd1rucpc9vz2-4{list-style-type:none}ul.lst-kix_fd1rucpc9vz2-5{list-style-type:none}ul.lst-kix_fd1rucpc9vz2-6{list-style-type:none}.lst-kix_fd1rucpc9vz2-6>li:before{content:"\0025cf "}ul.lst-kix_fd1rucpc9vz2-7{list-style-type:none}.lst-kix_5anu1k9tsyak-4>li:before{content:"\0025cb "}.lst-kix_s3mi7ukxwiwf-8>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-8}.lst-kix_iv2x96orjh4l-4>li:before{content:"\0025cb "}.lst-kix_s3mi7ukxwiwf-6>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-6,decimal) ". "}.lst-kix_fy6y7gyjejoh-8>li:before{content:"\0025a0 "}ol.lst-kix_xv318blpjdo-4.start{counter-reset:lst-ctn-kix_xv318blpjdo-4 0}.lst-kix_x1epm4iu41dp-1>li:before{content:"\0025cb "}.lst-kix_q97rvvc7c69e-8>li:before{content:"\0025a0 "}ol.lst-kix_xv318blpjdo-5.start{counter-reset:lst-ctn-kix_xv318blpjdo-5 0}ul.lst-kix_8p26nc4xx5n8-0{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-1{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-2{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-3{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-4{list-style-type:none}.lst-kix_emhp84jkv42c-0>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-0,upper-roman) ". "}.lst-kix_emhp84jkv42c-8>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-8,lower-roman) ") "}.lst-kix_9jxnjym0nges-1>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-5.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-5 0}.lst-kix_ndaonzmgp8vn-3>li:before{content:"\0025cf "}.lst-kix_jj5w63toozfm-8>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-8,lower-roman) ". "}.lst-kix_u0uqs69v9qbh-1>li:before{content:"\0025cb "}.lst-kix_opi66v2qdsjs-1>li:before{content:"\0025cb "}.lst-kix_11a9ub9xa97v-7>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-7,lower-latin) ") "}.lst-kix_8p26nc4xx5n8-5>li:before{content:"\0025a0 "}ol.lst-kix_xv318blpjdo-6.start{counter-reset:lst-ctn-kix_xv318blpjdo-6 0}.lst-kix_1wulu3ra2vwv-0>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-0}.lst-kix_gyhqddkw9i05-5>li:before{content:"\0025a0 "}ul.lst-kix_6qnkx7t1adn9-8{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-4.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-4 0}ul.lst-kix_6qnkx7t1adn9-7{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-5{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-6{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-6{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-5{list-style-type:none}.lst-kix_sholqrhc62dh-3>li:before{content:"\0025cf "}ul.lst-kix_8p26nc4xx5n8-7{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-4{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-8{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-3{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-2{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-1{list-style-type:none}.lst-kix_1wulu3ra2vwv-1>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-1,upper-latin) ". "}ul.lst-kix_6qnkx7t1adn9-0{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c30{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c17{color:#666666;font-weight:400;text-decoration:underline;vertical-align:baseline;font-family:"Trebuchet MS";font-style:normal}.c2{padding-top:6pt;padding-bottom:0pt;line-height:1.2;orphans:2;widows:2;text-align:left}.c9{padding-top:24pt;padding-bottom:0pt;line-height:1.3;page-break-after:avoid;text-align:left}.c15{padding-top:8pt;padding-bottom:0pt;line-height:1.2;page-break-after:avoid;text-align:left}.c0{padding-top:0pt;padding-bottom:0pt;line-height:1.2;text-align:left}.c13{color:#008575;font-weight:400;font-size:16pt;font-family:"PT Sans Narrow"}.c3{font-size:9pt;font-family:"Consolas";color:#666600;font-weight:400}.c10{padding-top:0pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c1{font-size:9pt;font-family:"Consolas";color:#000000;font-weight:400}.c8{font-size:9pt;font-family:"Consolas";color:#006666;font-weight:400}.c31{color:#695d46;font-weight:700;font-size:42pt;font-family:"PT Sans Narrow"}.c20{padding-top:16pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c24{font-family:"Open Sans";color:#1155cc;font-weight:400;text-decoration:underline}.c22{color:#ff5e0e;font-weight:700;font-size:18pt;font-family:"PT Sans Narrow"}.c21{color:#000000;font-weight:700;font-size:9pt;font-family:"Consolas"}.c23{font-size:9pt;font-family:"Consolas";color:#660066;font-weight:400}.c25{font-size:9pt;font-family:"Consolas";color:#880000;font-weight:400}.c19{font-size:9pt;font-family:"Consolas";color:#000088;font-weight:400}.c6{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c26{color:#000000;font-weight:400;font-family:"Arial"}.c11{font-family:"Open Sans";color:#695d46;font-weight:400}.c5{text-decoration:none;vertical-align:baseline;font-style:normal}.c27{color:#000000;font-weight:400;font-family:"Open Sans"}.c18{color:inherit;text-decoration:inherit}.c32{orphans:2;widows:2}.c28{font-weight:400;font-family:"Open Sans"}.c14{padding:0;margin:0}.c7{margin-left:36pt}.c4{margin-left:72pt}.c12{font-size:11pt}.c33{font-size:12pt}.c29{font-size:8pt}.c16{padding-left:0pt}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left} 

Oracle Fusion Middleware Deployments Using Docker Swarm Part II

Overview

This is the second in a series of blogs that describe how to build a Fusion Middleware (FMW) Cluster that runs as a number of Docker images that run in docker containers.  These containers are coordinated using Docker Swarm and can be deployed to a single host machine or multiple hosts.  This simplifies the task of building FMW clusters and also makes it easier to scale them in and out (adding or subtracting host machines) as well as up and down (using bigger or smaller host machines).

This blog uses Oracle Service Bus as an FMW product but the principles are applicable to other FMW products.

In our previous blog we talked about the overall requirements for running FMW on Docker Swarm and sketched out our overall approach.

In this entry we will explain the concepts of using Docker base images and create an Oracle database image and an Oracle Service Bus image.  The next blog will cover how to create an OSB domain and how to run this in Docker Swarm.

Notes on Building on Existing Docker Images

Docker allows you to create a new image by basing it on an existing image.  The “FROM” instruction in a dockerfile tells docker the base image that you are using as your foundation.  We will build a number of database base images that can then be reused later.

A docker image is a set of files and configuration.  A docker image runs in a docker container.  So a single image may be running in zero, one or more containers.  Think of the image as the software and configuration, think of the container as the active running image.

The diagram shows the images that we will build and their base images referenced in the FROM instruction.


Docker FMW Image Dependencies

The solid lines indicate the image reference by the FROM command in the dockerfile used to create an image.  The dotted lines represent dependencies on other images.

More details on the images will be given in the next section, but the following bullets explain how they work.  Note that we can store the created images in a company docker registry so that they can be reused.

  • Oracle Linux is an image that we use as our starting point.  This is available from github along with instructions (dockerfiles) to create the other images.
  • Oracle Database image is created by installing the Oracle database binaries into the Oracle Linux image.  This image can be used to create databases with different characteristics, such as different character sets, different service and instance names etc.
  • An Oracle Database Instance is created by running the database configuration assistant in a container created from the Oracle Database image.
  • JDK 8 image is created by installing a JDK 8 into the generic Linux image, this could be reused by any software requiring Java.
  • Fusion Middleware Infrastructure image is created by installing the WebLogic Fusion Middleware Infrastructure into the JDK image.  This provides WebLogic and some additional Oracle infrastructure files that are used by Fusion Middleware.  This image can be reused by any Fusion Middleware product image.
  • Oracle Service Bus image provides us with Service Bus installation on top of the Fusion Middleware Infrastructure image.  This provides a software only installation, no domain is created so the image can be used to create any desired Service Bus domain configuration.
  • Service Bus Domain image is the image where we run the domain configuration utility to create a Service Bus domain.  Prior to running the domain configuration wizard the FMW repository configuration utility is run against the database container created from the Oracle Database Instance image.  Depending on the options chosen this could be pointed to and used by a number of different FMW components.  In our case we will install the SOA schemas. We need to refer to the Oracle Database Container to be able to run the RCU and also to complete the domain creation.  Different run commands are used to start a container to run either the Admin Server or a Managed Server.
Retrieving Docker Files for OSB Cluster

We are posting all the required files to go along with this blog on github.  You are welcome to fork from this and improve it.  We cloned many of these files from the official Oracle docker github.  We removed unused versions and added a simplified build.sh file to each product directory to make it easy to see how we actually built our environment.  We are still updating the files online and will shortly add details on building the service bus cluster.  We made the following additional changes to the standard Oracle files:

  • Java - we used the JDK rather than the JRE.
  • WebLogic - we added a 12.2.1.2 FMW Infrastructure alongside the generic and developer options.  This is available in other versions of the Oracle files but not in the 12.2.1.2 files.
  • OSB and SOA - Added OSB and SOA directories along with their associated files.
Database Creation

Because Oracle Fusion Middleware relies on a database we need to create a database image.  Once we have created the database then we need to create the FMW schemas within it by running the Repository Creation Utility.  The Repository Creation Utility is only available in the FMW installed code, so to create the schemas we also need to install our FMW component, in our case Service Bus.  The steps we will follow to build, create and configure the database are as follows:

  1. Build Oracle Database image using the Oracle provided database dockerfile.
  2. Create an Oracle Database Instance by creating a docker container and using the provided scripts to initialize the container with a database instance.

Detailed instructions to build the database image are provided in the section “Oracle Database Build Steps

We create the database instance in a docker container rather than baking it into an image because we only want to run a single instance of the database container.

FMW Installation

We will use multiple layered images to get to our FMW install image.  Each image is kept separate to make it flexible and reusable.  For example given the WebLogic FMW Infrastructure image we could create separate FMW images for SOA Suite, WebCenter and Business Intelligence for example.

  • We will install JDK 8 to create a JDK 8 image.  This can be used to create any image requiring a JDK 8 installation.  This if built on top of the Oracle Linux 7 image.
  • We build on top of the JDK 8 image to install Fusion Middleware Infrastructure into a WebLogic FMW Infrastructure image.  This can be used as the basis of any FMW images in the future.
  • In our example we install SOA or OSB on top of the WebLogic FMW Infrastructure image as our FMW component.  This does not create a domain.  It just installs the software.

Detailed steps are given in the sections “Weblogic Docker Image Build Steps” and “OSB Docker Image Build steps

General Build Instructions

You can download our dockerfiles by cloning our github onto your build machine.

git clone https://github.com/Shuxuan/OSB-Docker-Swarm.git

This will create a directory OSB-Docker-Swarm.  We will refer to the location of this as <MASTER> in subsequent instructions.

Database Docker Image Build Steps

There is an excellent blog on Creating an Oracle Database Docker image by Gerald Venzi that covers everything.  We have provided a minimal description of the steps here only to be self contained.

  1. Get Oracle Database Binaries

Retrieve the Oracle 12.1.0.2 binaries from OTN http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

  • linuxamd64_12102_database_1of2.zip
  • linuxamd64_12102_database_2of2.zip

  and place them at <MASTER>/OracleDatabase/dockerfiles/12.1.0.2.

  1. Build Oracle Database Docker Image
  • Create a Docker Image for the database using the binaries from the previous step.  This installs the database binaries and saves the result as a docker image.  The build.sh has all the paramters needed by the dockerfile, if you are interested in what they do check out the official Oracle docker database image docs.  Note that if we don’t have the Oracle Linux image then the build process will retrieve it from docker hub.

<MASTER>/OracleDatabase/build.sh

  • Check the image has been built properly by making sure it is listed by the docker images command.

$ docker images

REPOSITORY      TAG         IMAGE ID      CREATED         SIZE

oracle/database 12.1.0.2-ee 8f0f3c5f4170  49 seconds ago  11.24 GB

oraclelinux     latest      27a5201e554e  3 weeks ago     225.1 MB

  1. Create Oracle Database
  • Run a docker container based on the previously built docker image to create the database instance.  The create_db.sh command that we provide will do this.  Again the details of how it works are in the official Oracle docker database image docs.  We also added a -d parameter to run the container in the background.

./create_db.sh

  • Check container logs
    docker logs <container_id>
  • Change DB password by running the set_db_password.sh we provide which sets the database password to be FMWDocker.  You can edit the file to change the password.  We also modified this file to set the password policy to not expire the passwords.

./set_db_password.sh

We now have an Oracle database instance running in a docker container.

Weblogic Docker Image Build Steps
  1. Build JDK 1.8 Docker image based on base image
  • Go to <MASTER>/oraclejdk8 folder
  • Download jdk 8 install binary file, jdk-8uXXX-linux-x64.tar.gz from OTN into oraclejdk8 folder.  Any version that starts jdk-8 should work.
  • Run build.sh

./build.sh

  • Check that image has been created

$ docker images

REPOSITORY       TAG          IMAGE ID      CREATED         SIZE

oracle/database  12.1.0.2-ee  086a4a3541bc  34 minutes ago  11.24 GB

oracle/serverjdk 8            85aebb7b773e  22 hours ago    590.4 MB

oraclelinux      latest       27a5201e554e  3 weeks ago     225.1 MB

This JDK image is then used as a base for future images.

  1. Build Weblogic 12.2.1.2 installation image based on JDK 1.8 image
  • Go to folder <MASTER>/wls12.2.1.2
  • Download fmw_12.2.1.2.0_infrastructure_Disk1_1of1.zip from OTN to folder wls12.2.1.2
  • Run build.sh

./build.sh

  • Run docker images to check the image created in the above steps

$ docker images

REPOSITORY        TAG                      IMAGE ID     CREATED              SIZE

oracle/weblogic   12.2.1.2-infrastructure  9eceea30c474 About a minute ago   4.096 GB

oracle/database   12.1.0.2-ee              086a4a3541bc About an hour ago    11.24 GB

oracle/serverjdk  8                        85aebb7b773e 22 hours ago         590.4 MB

oraclelinux       latest                   27a5201e554e 3 weeks ago          225.1 MB

This gives us our FMW infrastructure docker image.

OSB Docker Image Build steps
  • Go to folder <MASTER>/osb
  • Download fmw_12.2.1.2.0_osb.jar from OTN to folder osb.  If unavailable on OTN it is available from e-delivery if you have a Service Bus license.
  • Run build.sh

./build.sh

  • Check docker image built in the above step

$ docker images

REPOSITORY        TAG                     IMAGE ID     CREATED             SIZE

oracle/osb        12.2.1.2                59021dc16e40 5 minutes ago       7.231 GB

oracle/weblogic   12.2.1.2-infrastructure 9eceea30c474 12 minutes ago      4.096 GB

oracle/database   12.1.0.2-ee             086a4a3541bc About an hour ago   11.24 GB

oracle/serverjdk  8                       85aebb7b773e 23 hours ago        590.4 MB

oraclelinux       latest                  27a5201e554e 3 weeks ago         225.1 MB

This gives us our FMW product docker image, in our case service bus.  We also provided SOA Suite dockerfiles in the git repository.

Summary

In this entry we have explained how to install Fusion Middleware and Oracle Database as Docker images, and how to create a Database container.  In our next entry we will use these images to create a cluster in swarm mode by defining swarm services for the database, WebLogic Admin Server and WebLogic managed servers.

Building an FMW Cluster using Docker (Part II Building Docker Images)

Fri, 2017-01-20 20:02
@import url('https://themes.googleusercontent.com/fonts/css?kit=cGvuclDC_Z1vE_cnVEU6AQ3B2cQio22zuQYmMduN3_mWtMd0Jq3ZhX9v3IQGKB3u249SeSIUngoluNcHmRb61Bz1ZjgTUtEb3dCu921NmgQ');.lst-kix_sholqrhc62dh-7>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-8>li:before{content:"\0025a0 "}.lst-kix_sholqrhc62dh-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-3.start{counter-reset:lst-ctn-kix_xv318blpjdo-3 0}.lst-kix_sholqrhc62dh-1>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-0>li:before{content:"\0025cf "}.lst-kix_emhp84jkv42c-3>li{counter-increment:lst-ctn-kix_emhp84jkv42c-3}.lst-kix_ekmayt81kvbz-0>li:before{content:"\0025cf "}.lst-kix_jj5w63toozfm-4>li{counter-increment:lst-ctn-kix_jj5w63toozfm-4}.lst-kix_ekmayt81kvbz-2>li:before{content:"\0025a0 "}ul.lst-kix_qeqyxe7gm97l-6{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-5{list-style-type:none}.lst-kix_ekmayt81kvbz-1>li:before{content:"\0025cb "}ul.lst-kix_qeqyxe7gm97l-4{list-style-type:none}.lst-kix_ekmayt81kvbz-3>li:before{content:"\0025cf "}ul.lst-kix_qeqyxe7gm97l-3{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-2{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-1{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-0{list-style-type:none}ol.lst-kix_11a9ub9xa97v-8.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-8 0}.lst-kix_ekmayt81kvbz-5>li:before{content:"\0025a0 "}.lst-kix_ekmayt81kvbz-7>li:before{content:"\0025cb "}ul.lst-kix_4m04az9jmmj8-3{list-style-type:none}ul.lst-kix_4m04az9jmmj8-2{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-8{list-style-type:none}ul.lst-kix_4m04az9jmmj8-1{list-style-type:none}.lst-kix_ekmayt81kvbz-4>li:before{content:"\0025cb "}.lst-kix_ekmayt81kvbz-8>li:before{content:"\0025a0 "}ul.lst-kix_qeqyxe7gm97l-7{list-style-type:none}ul.lst-kix_4m04az9jmmj8-0{list-style-type:none}ul.lst-kix_4m04az9jmmj8-7{list-style-type:none}ul.lst-kix_4m04az9jmmj8-6{list-style-type:none}ul.lst-kix_4m04az9jmmj8-5{list-style-type:none}ul.lst-kix_4m04az9jmmj8-4{list-style-type:none}.lst-kix_ekmayt81kvbz-6>li:before{content:"\0025cf "}ul.lst-kix_4m04az9jmmj8-8{list-style-type:none}.lst-kix_s3mi7ukxwiwf-2>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-2}.lst-kix_11a9ub9xa97v-0>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-0}ol.lst-kix_emhp84jkv42c-4.start{counter-reset:lst-ctn-kix_emhp84jkv42c-4 0}ol.lst-kix_xv318blpjdo-8.start{counter-reset:lst-ctn-kix_xv318blpjdo-8 0}ul.lst-kix_6ril5iwt0fcl-5{list-style-type:none}.lst-kix_q8ok0mh9yyto-8>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-8}ul.lst-kix_6ril5iwt0fcl-4{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-3{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-2{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-8{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-7{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-6{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-8.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-8 0}ul.lst-kix_6ril5iwt0fcl-1{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-0{list-style-type:none}.lst-kix_xv318blpjdo-1>li{counter-increment:lst-ctn-kix_xv318blpjdo-1}.lst-kix_bfzyeb917dp8-6>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-6}.lst-kix_s3mi7ukxwiwf-1>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-1,lower-latin) ". "}.lst-kix_gfromclascha-0>li:before{content:"\0025cf "}.lst-kix_gfromclascha-2>li:before{content:"\0025a0 "}.lst-kix_gfromclascha-4>li:before{content:"\0025cb "}ol.lst-kix_bfzyeb917dp8-7.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-7 0}.lst-kix_6ril5iwt0fcl-0>li:before{content:"\0025cf "}.lst-kix_gfromclascha-6>li:before{content:"\0025cf "}.lst-kix_q97rvvc7c69e-5>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-7>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-8.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-8 0}.lst-kix_6ril5iwt0fcl-2>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-3>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-7>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-7,lower-latin) ". "}.lst-kix_6ril5iwt0fcl-4>li:before{content:"\0025cb "}.lst-kix_6ril5iwt0fcl-6>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-8>li{counter-increment:lst-ctn-kix_xv318blpjdo-8}.lst-kix_s3mi7ukxwiwf-5>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-5,lower-roman) ". "}.lst-kix_6ril5iwt0fcl-8>li:before{content:"\0025a0 "}.lst-kix_s3mi7ukxwiwf-3>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-3,decimal) ". "}ol.lst-kix_jj5w63toozfm-7.start{counter-reset:lst-ctn-kix_jj5w63toozfm-7 0}.lst-kix_1wulu3ra2vwv-4>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-4,decimal) ") "}.lst-kix_1wulu3ra2vwv-6>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-6,lower-roman) ") "}.lst-kix_1wulu3ra2vwv-8>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-8,lower-roman) ") "}.lst-kix_gfromclascha-8>li:before{content:"\0025a0 "}.lst-kix_sholqrhc62dh-2>li:before{content:"\0025a0 "}ul.lst-kix_9jxnjym0nges-0{list-style-type:none}.lst-kix_sholqrhc62dh-4>li:before{content:"\0025cb "}.lst-kix_1wulu3ra2vwv-2>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-2,decimal) ". "}.lst-kix_1wulu3ra2vwv-0>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-0,upper-roman) ". "}ol.lst-kix_11a9ub9xa97v-3.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-3 0}.lst-kix_emhp84jkv42c-2>li{counter-increment:lst-ctn-kix_emhp84jkv42c-2}ol.lst-kix_s3mi7ukxwiwf-4.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-4 0}ul.lst-kix_h0kibz3smj6t-8{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-7.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-7 0}.lst-kix_jkgkf1u9sy0c-2>li:before{content:"\0025a0 "}.lst-kix_jkgkf1u9sy0c-1>li:before{content:"\0025cb "}ul.lst-kix_iv2x96orjh4l-2{list-style-type:none}ul.lst-kix_iv2x96orjh4l-3{list-style-type:none}ul.lst-kix_iv2x96orjh4l-0{list-style-type:none}.lst-kix_jj5w63toozfm-3>li{counter-increment:lst-ctn-kix_jj5w63toozfm-3}ul.lst-kix_iv2x96orjh4l-1{list-style-type:none}ul.lst-kix_iv2x96orjh4l-6{list-style-type:none}ul.lst-kix_iv2x96orjh4l-7{list-style-type:none}ul.lst-kix_iv2x96orjh4l-4{list-style-type:none}ul.lst-kix_iv2x96orjh4l-5{list-style-type:none}ul.lst-kix_h0kibz3smj6t-3{list-style-type:none}ul.lst-kix_h0kibz3smj6t-2{list-style-type:none}ul.lst-kix_h0kibz3smj6t-1{list-style-type:none}.lst-kix_jkgkf1u9sy0c-5>li:before{content:"\0025a0 "}ul.lst-kix_h0kibz3smj6t-0{list-style-type:none}ol.lst-kix_jj5w63toozfm-2.start{counter-reset:lst-ctn-kix_jj5w63toozfm-2 0}ul.lst-kix_h0kibz3smj6t-7{list-style-type:none}ul.lst-kix_h0kibz3smj6t-6{list-style-type:none}ul.lst-kix_h0kibz3smj6t-5{list-style-type:none}.lst-kix_jkgkf1u9sy0c-6>li:before{content:"\0025cf "}ul.lst-kix_h0kibz3smj6t-4{list-style-type:none}.lst-kix_emhp84jkv42c-4>li{counter-increment:lst-ctn-kix_emhp84jkv42c-4}ul.lst-kix_iv2x96orjh4l-8{list-style-type:none}ol.lst-kix_bfzyeb917dp8-3.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-3 0}.lst-kix_b7256qmdgo85-3>li:before{content:"\0025cf "}.lst-kix_b7256qmdgo85-4>li:before{content:"\0025cb "}.lst-kix_b7256qmdgo85-7>li:before{content:"\0025cb "}ol.lst-kix_jj5w63toozfm-3.start{counter-reset:lst-ctn-kix_jj5w63toozfm-3 0}.lst-kix_q97rvvc7c69e-2>li:before{content:"\0025a0 "}.lst-kix_b7256qmdgo85-8>li:before{content:"\0025a0 "}ol.lst-kix_bfzyeb917dp8-2.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-2 0}ol.lst-kix_1wulu3ra2vwv-6.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-6 0}.lst-kix_jj5w63toozfm-5>li{counter-increment:lst-ctn-kix_jj5w63toozfm-5}.lst-kix_s3mi7ukxwiwf-0>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-0,decimal) ". "}ul.lst-kix_q97rvvc7c69e-4{list-style-type:none}ul.lst-kix_q97rvvc7c69e-3{list-style-type:none}ul.lst-kix_q97rvvc7c69e-6{list-style-type:none}.lst-kix_s3mi7ukxwiwf-8>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-8,lower-roman) ". "}ul.lst-kix_q97rvvc7c69e-5{list-style-type:none}ul.lst-kix_q97rvvc7c69e-8{list-style-type:none}ul.lst-kix_q97rvvc7c69e-7{list-style-type:none}.lst-kix_gfromclascha-3>li:before{content:"\0025cf "}ul.lst-kix_q97rvvc7c69e-0{list-style-type:none}ul.lst-kix_q97rvvc7c69e-2{list-style-type:none}ul.lst-kix_q97rvvc7c69e-1{list-style-type:none}.lst-kix_q97rvvc7c69e-6>li:before{content:"\0025cf "}.lst-kix_6ril5iwt0fcl-1>li:before{content:"\0025cb "}.lst-kix_iv2x96orjh4l-6>li:before{content:"\0025cf "}ol.lst-kix_s3mi7ukxwiwf-3.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-3 0}.lst-kix_6ril5iwt0fcl-5>li:before{content:"\0025a0 "}.lst-kix_iv2x96orjh4l-2>li:before{content:"\0025a0 "}.lst-kix_q8ok0mh9yyto-1>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-1}.lst-kix_s3mi7ukxwiwf-4>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-4,lower-latin) ". "}.lst-kix_5anu1k9tsyak-2>li:before{content:"\0025a0 "}.lst-kix_b7256qmdgo85-0>li:before{content:"\0025cf "}.lst-kix_1wulu3ra2vwv-3>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-3,lower-latin) ") "}.lst-kix_11a9ub9xa97v-7>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-7}.lst-kix_1wulu3ra2vwv-7>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-7,lower-latin) ") "}.lst-kix_1wulu3ra2vwv-6>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-6}.lst-kix_gfromclascha-7>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-5>li:before{content:"\0025a0 "}.lst-kix_86hsx13ssqid-1>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-5>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-0>li:before{content:"\0025cf "}.lst-kix_7tib3jrzu2u9-5>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-2>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-3>li:before{content:"\0025cf "}ul.lst-kix_ndaonzmgp8vn-4{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-3{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-6{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-5{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-0{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-2{list-style-type:none}.lst-kix_bfzyeb917dp8-4>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-4}ul.lst-kix_ndaonzmgp8vn-1{list-style-type:none}.lst-kix_7tib3jrzu2u9-8>li:before{content:"\0025a0 "}ul.lst-kix_sholqrhc62dh-6{list-style-type:none}ul.lst-kix_sholqrhc62dh-5{list-style-type:none}ul.lst-kix_sholqrhc62dh-4{list-style-type:none}ul.lst-kix_sholqrhc62dh-3{list-style-type:none}ul.lst-kix_sholqrhc62dh-8{list-style-type:none}ul.lst-kix_sholqrhc62dh-7{list-style-type:none}ul.lst-kix_sholqrhc62dh-2{list-style-type:none}ol.lst-kix_bfzyeb917dp8-6.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-6 0}ul.lst-kix_sholqrhc62dh-1{list-style-type:none}ul.lst-kix_sholqrhc62dh-0{list-style-type:none}.lst-kix_emhp84jkv42c-1>li{counter-increment:lst-ctn-kix_emhp84jkv42c-1}ul.lst-kix_ndaonzmgp8vn-8{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-7{list-style-type:none}.lst-kix_j42a5dwgnqyq-8>li:before{content:"\0025a0 "}.lst-kix_5anu1k9tsyak-6>li:before{content:"\0025cf "}ol.lst-kix_bfzyeb917dp8-1.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-1 0}.lst-kix_j42a5dwgnqyq-7>li:before{content:"\0025cb "}.lst-kix_qeqyxe7gm97l-7>li:before{content:"\0025cb "}.lst-kix_qeqyxe7gm97l-8>li:before{content:"\0025a0 "}.lst-kix_5anu1k9tsyak-8>li:before{content:"\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-2.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-2 0}ul.lst-kix_686a8e4qhxwx-4{list-style-type:none}ul.lst-kix_686a8e4qhxwx-3{list-style-type:none}ul.lst-kix_686a8e4qhxwx-2{list-style-type:none}ul.lst-kix_686a8e4qhxwx-1{list-style-type:none}ul.lst-kix_686a8e4qhxwx-8{list-style-type:none}ul.lst-kix_686a8e4qhxwx-7{list-style-type:none}ul.lst-kix_686a8e4qhxwx-6{list-style-type:none}.lst-kix_6qnkx7t1adn9-0>li:before{content:"\0025cf "}.lst-kix_qeqyxe7gm97l-0>li:before{content:"\0025cf "}ul.lst-kix_686a8e4qhxwx-5{list-style-type:none}.lst-kix_6qnkx7t1adn9-1>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-3>li:before{content:"\0025cf "}ul.lst-kix_686a8e4qhxwx-0{list-style-type:none}.lst-kix_bfzyeb917dp8-0>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-0}.lst-kix_qeqyxe7gm97l-5>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-0>li:before{content:"\0025cf "}.lst-kix_j42a5dwgnqyq-2>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-5>li:before{content:"\0025a0 "}ol.lst-kix_emhp84jkv42c-3.start{counter-reset:lst-ctn-kix_emhp84jkv42c-3 0}.lst-kix_qeqyxe7gm97l-2>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-8>li{counter-increment:lst-ctn-kix_emhp84jkv42c-8}ol.lst-kix_s3mi7ukxwiwf-0.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-0 0}.lst-kix_86hsx13ssqid-8>li:before{content:"\0025a0 "}.lst-kix_s3mi7ukxwiwf-0>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-0}.lst-kix_fd1rucpc9vz2-5>li:before{content:"\0025a0 "}.lst-kix_fd1rucpc9vz2-7>li:before{content:"\0025cb "}.lst-kix_iv2x96orjh4l-5>li:before{content:"\0025a0 "}.lst-kix_iv2x96orjh4l-3>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-3>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-5>li:before{content:"\0025a0 "}.lst-kix_1wulu3ra2vwv-8>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-8}ol.lst-kix_q8ok0mh9yyto-6{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-5{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-4{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-3{list-style-type:none}.lst-kix_9jxnjym0nges-0>li:before{content:"\0025cf "}ol.lst-kix_q8ok0mh9yyto-8{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-7{list-style-type:none}ol.lst-kix_emhp84jkv42c-0.start{counter-reset:lst-ctn-kix_emhp84jkv42c-0 0}.lst-kix_opi66v2qdsjs-8>li:before{content:"\0025a0 "}.lst-kix_ndaonzmgp8vn-4>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-2{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-1{list-style-type:none}.lst-kix_9jxnjym0nges-2>li:before{content:"\0025a0 "}ol.lst-kix_q8ok0mh9yyto-0{list-style-type:none}.lst-kix_ndaonzmgp8vn-2>li:before{content:"\0025a0 "}.lst-kix_opi66v2qdsjs-2>li:before{content:"\0025a0 "}.lst-kix_11a9ub9xa97v-0>li:before{content:"" counter(lst-ctn-kix_11a9ub9xa97v-0,upper-roman) ". "}ol.lst-kix_bfzyeb917dp8-4.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-4 0}.lst-kix_q8ok0mh9yyto-3>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-3}.lst-kix_11a9ub9xa97v-8>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-8,lower-roman) ") "}.lst-kix_86hsx13ssqid-0>li:before{content:"\0025cf "}.lst-kix_86hsx13ssqid-6>li:before{content:"\0025cf "}.lst-kix_9jxnjym0nges-8>li:before{content:"\0025a0 "}.lst-kix_11a9ub9xa97v-6>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-6,lower-roman) ") "}ul.lst-kix_9jxnjym0nges-2{list-style-type:none}.lst-kix_xv318blpjdo-2>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-2,decimal) ". "}ul.lst-kix_9jxnjym0nges-1{list-style-type:none}ul.lst-kix_9jxnjym0nges-4{list-style-type:none}ul.lst-kix_9jxnjym0nges-3{list-style-type:none}.lst-kix_h0kibz3smj6t-5>li:before{content:"\0025a0 "}ul.lst-kix_9jxnjym0nges-6{list-style-type:none}ul.lst-kix_9jxnjym0nges-5{list-style-type:none}ul.lst-kix_9jxnjym0nges-8{list-style-type:none}ul.lst-kix_9jxnjym0nges-7{list-style-type:none}.lst-kix_xv318blpjdo-2>li{counter-increment:lst-ctn-kix_xv318blpjdo-2}.lst-kix_s3mi7ukxwiwf-3>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-3}.lst-kix_bfzyeb917dp8-7>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-7}ol.lst-kix_emhp84jkv42c-1.start{counter-reset:lst-ctn-kix_emhp84jkv42c-1 0}.lst-kix_jkgkf1u9sy0c-4>li:before{content:"\0025cb "}ol.lst-kix_jj5w63toozfm-3{list-style-type:none}ol.lst-kix_jj5w63toozfm-4{list-style-type:none}ol.lst-kix_jj5w63toozfm-5{list-style-type:none}.lst-kix_jkgkf1u9sy0c-7>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-7>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-7,lower-latin) ") "}.lst-kix_686a8e4qhxwx-5>li:before{content:"\0025a0 "}ol.lst-kix_jj5w63toozfm-6{list-style-type:none}ol.lst-kix_jj5w63toozfm-7{list-style-type:none}ol.lst-kix_jj5w63toozfm-8{list-style-type:none}.lst-kix_h0kibz3smj6t-2>li:before{content:"\0025a0 "}.lst-kix_q8ok0mh9yyto-7>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-7}ol.lst-kix_jj5w63toozfm-0{list-style-type:none}ol.lst-kix_jj5w63toozfm-1{list-style-type:none}.lst-kix_686a8e4qhxwx-2>li:before{content:"\0025a0 "}ol.lst-kix_jj5w63toozfm-2{list-style-type:none}ol.lst-kix_11a9ub9xa97v-3{list-style-type:none}ol.lst-kix_bfzyeb917dp8-8.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-8 0}ol.lst-kix_11a9ub9xa97v-2{list-style-type:none}ol.lst-kix_11a9ub9xa97v-1{list-style-type:none}ol.lst-kix_11a9ub9xa97v-0{list-style-type:none}.lst-kix_b7256qmdgo85-2>li:before{content:"\0025a0 "}ol.lst-kix_11a9ub9xa97v-8{list-style-type:none}ol.lst-kix_11a9ub9xa97v-7{list-style-type:none}ol.lst-kix_11a9ub9xa97v-6{list-style-type:none}ol.lst-kix_11a9ub9xa97v-5{list-style-type:none}.lst-kix_4m04az9jmmj8-7>li:before{content:"\0025cb "}ol.lst-kix_11a9ub9xa97v-4{list-style-type:none}.lst-kix_b7256qmdgo85-5>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-1>li:before{content:"\0025cb "}.lst-kix_q8ok0mh9yyto-5>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-5,lower-latin) ") "}.lst-kix_4m04az9jmmj8-4>li:before{content:"\0025cb "}.lst-kix_bfzyeb917dp8-3>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-3}.lst-kix_q8ok0mh9yyto-8>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-8,lower-roman) ") "}ol.lst-kix_bfzyeb917dp8-5{list-style-type:none}ol.lst-kix_bfzyeb917dp8-4{list-style-type:none}ol.lst-kix_bfzyeb917dp8-3{list-style-type:none}ol.lst-kix_bfzyeb917dp8-2{list-style-type:none}ol.lst-kix_bfzyeb917dp8-8{list-style-type:none}ol.lst-kix_bfzyeb917dp8-7{list-style-type:none}ol.lst-kix_bfzyeb917dp8-6{list-style-type:none}ol.lst-kix_bfzyeb917dp8-1{list-style-type:none}ol.lst-kix_bfzyeb917dp8-0{list-style-type:none}ol.lst-kix_emhp84jkv42c-5.start{counter-reset:lst-ctn-kix_emhp84jkv42c-5 0}.lst-kix_q8ok0mh9yyto-0>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-0}.lst-kix_iv2x96orjh4l-8>li:before{content:"\0025a0 "}.lst-kix_6qnkx7t1adn9-6>li:before{content:"\0025cf "}.lst-kix_gfromclascha-5>li:before{content:"\0025a0 "}ol.lst-kix_emhp84jkv42c-8.start{counter-reset:lst-ctn-kix_emhp84jkv42c-8 0}.lst-kix_11a9ub9xa97v-8>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-8}.lst-kix_x1epm4iu41dp-5>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-4>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-5>li{counter-increment:lst-ctn-kix_xv318blpjdo-5}.lst-kix_1wulu3ra2vwv-5>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-5}.lst-kix_5anu1k9tsyak-0>li:before{content:"\0025cf "}.lst-kix_fy6y7gyjejoh-4>li:before{content:"\0025cb "}.lst-kix_ndaonzmgp8vn-7>li:before{content:"\0025cb "}.lst-kix_iv2x96orjh4l-0>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-2>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-2,lower-roman) ". "}.lst-kix_6ril5iwt0fcl-7>li:before{content:"\0025cb "}.lst-kix_emhp84jkv42c-4>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-4,decimal) ") "}.lst-kix_emhp84jkv42c-5>li{counter-increment:lst-ctn-kix_emhp84jkv42c-5}.lst-kix_jj5w63toozfm-4>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-4,lower-latin) ". "}.lst-kix_1wulu3ra2vwv-5>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-5,lower-latin) ") "}ul.lst-kix_u0uqs69v9qbh-8{list-style-type:none}.lst-kix_11a9ub9xa97v-1>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-1}ul.lst-kix_u0uqs69v9qbh-4{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-5{list-style-type:none}.lst-kix_opi66v2qdsjs-5>li:before{content:"\0025a0 "}ul.lst-kix_u0uqs69v9qbh-6{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-7{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-0{list-style-type:none}ul.lst-kix_gyhqddkw9i05-6{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-1{list-style-type:none}ul.lst-kix_gyhqddkw9i05-5{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-2{list-style-type:none}ul.lst-kix_gyhqddkw9i05-8{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-3{list-style-type:none}ul.lst-kix_gyhqddkw9i05-7{list-style-type:none}ol.lst-kix_emhp84jkv42c-7.start{counter-reset:lst-ctn-kix_emhp84jkv42c-7 0}.lst-kix_fd1rucpc9vz2-2>li:before{content:"\0025a0 "}ul.lst-kix_jkgkf1u9sy0c-4{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-5{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-6{list-style-type:none}ul.lst-kix_gyhqddkw9i05-0{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-7{list-style-type:none}.lst-kix_bfzyeb917dp8-2>li:before{content:"" counter(lst-ctn-kix_bfzyeb917dp8-2,decimal) ". "}.lst-kix_gyhqddkw9i05-1>li:before{content:"\0025cb "}ul.lst-kix_jkgkf1u9sy0c-8{list-style-type:none}ul.lst-kix_gyhqddkw9i05-2{list-style-type:none}ul.lst-kix_gyhqddkw9i05-1{list-style-type:none}ul.lst-kix_gyhqddkw9i05-4{list-style-type:none}ul.lst-kix_gyhqddkw9i05-3{list-style-type:none}.lst-kix_11a9ub9xa97v-3>li:before{content:"" counter(lst-ctn-kix_11a9ub9xa97v-3,lower-latin) ") "}ol.lst-kix_emhp84jkv42c-6.start{counter-reset:lst-ctn-kix_emhp84jkv42c-6 0}.lst-kix_8p26nc4xx5n8-1>li:before{content:"\0025cb "}.lst-kix_u0uqs69v9qbh-5>li:before{content:"\0025a0 "}.lst-kix_9jxnjym0nges-5>li:before{content:"\0025a0 "}.lst-kix_86hsx13ssqid-3>li:before{content:"\0025cf "}ul.lst-kix_jkgkf1u9sy0c-0{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-1{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-2{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-3{list-style-type:none}ol.lst-kix_jj5w63toozfm-5.start{counter-reset:lst-ctn-kix_jj5w63toozfm-5 0}ul.lst-kix_bijol4nzhwf0-8{list-style-type:none}ol.lst-kix_emhp84jkv42c-0{list-style-type:none}ol.lst-kix_emhp84jkv42c-2{list-style-type:none}ol.lst-kix_emhp84jkv42c-1{list-style-type:none}ol.lst-kix_emhp84jkv42c-4{list-style-type:none}ol.lst-kix_emhp84jkv42c-3{list-style-type:none}ol.lst-kix_emhp84jkv42c-6{list-style-type:none}ol.lst-kix_emhp84jkv42c-5{list-style-type:none}ol.lst-kix_emhp84jkv42c-8{list-style-type:none}ol.lst-kix_emhp84jkv42c-7{list-style-type:none}.lst-kix_11a9ub9xa97v-4>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-4}.lst-kix_1qz6dmm9b14l-4>li:before{content:"\0025cb "}.lst-kix_1qz6dmm9b14l-3>li:before{content:"\0025cf "}.lst-kix_1qz6dmm9b14l-5>li:before{content:"\0025a0 "}ul.lst-kix_j42a5dwgnqyq-0{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-1{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-2{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-3{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-4{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-5{list-style-type:none}.lst-kix_1qz6dmm9b14l-0>li:before{content:"\0025cf "}.lst-kix_1qz6dmm9b14l-8>li:before{content:"\0025a0 "}ul.lst-kix_j42a5dwgnqyq-6{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-7{list-style-type:none}.lst-kix_1qz6dmm9b14l-1>li:before{content:"\0025cb "}ol.lst-kix_bfzyeb917dp8-0.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-0 0}ul.lst-kix_j42a5dwgnqyq-8{list-style-type:none}.lst-kix_1qz6dmm9b14l-2>li:before{content:"\0025a0 "}ul.lst-kix_bijol4nzhwf0-4{list-style-type:none}ul.lst-kix_bijol4nzhwf0-5{list-style-type:none}ul.lst-kix_bijol4nzhwf0-6{list-style-type:none}ul.lst-kix_bijol4nzhwf0-7{list-style-type:none}ul.lst-kix_bijol4nzhwf0-0{list-style-type:none}ul.lst-kix_bijol4nzhwf0-1{list-style-type:none}ul.lst-kix_bijol4nzhwf0-2{list-style-type:none}ul.lst-kix_bijol4nzhwf0-3{list-style-type:none}.lst-kix_jj5w63toozfm-3>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-3,decimal) ". "}.lst-kix_1wulu3ra2vwv-2>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-2}.lst-kix_1qz6dmm9b14l-7>li:before{content:"\0025cb "}.lst-kix_jj5w63toozfm-2>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-2,lower-roman) ". "}.lst-kix_q8ok0mh9yyto-4>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-4}.lst-kix_1qz6dmm9b14l-6>li:before{content:"\0025cf "}.lst-kix_jj5w63toozfm-1>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-1,lower-latin) ". "}.lst-kix_h9mjmxara98n-7>li:before{content:"\0025cb "}.lst-kix_bijol4nzhwf0-7>li:before{content:"\0025cb "}.lst-kix_jj5w63toozfm-0>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-0,decimal) ". "}.lst-kix_h9mjmxara98n-6>li:before{content:"\0025cf "}.lst-kix_h9mjmxara98n-8>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-6>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-8>li:before{content:"\0025a0 "}.lst-kix_h9mjmxara98n-5>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-5>li:before{content:"\0025a0 "}.lst-kix_h9mjmxara98n-3>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-3>li:before{content:"\0025cf "}.lst-kix_h9mjmxara98n-2>li:before{content:"\0025a0 "}.lst-kix_h9mjmxara98n-4>li:before{content:"\0025cb "}.lst-kix_bijol4nzhwf0-2>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-4>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-1.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-1 0}ol.lst-kix_s3mi7ukxwiwf-1.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-1 0}.lst-kix_h9mjmxara98n-0>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-0>li:before{content:"\0025cf "}.lst-kix_h9mjmxara98n-1>li:before{content:"\0025cb "}.lst-kix_bijol4nzhwf0-1>li:before{content:"\0025cb "}.lst-kix_jj5w63toozfm-8>li{counter-increment:lst-ctn-kix_jj5w63toozfm-8}ul.lst-kix_gfromclascha-0{list-style-type:none}ol.lst-kix_emhp84jkv42c-2.start{counter-reset:lst-ctn-kix_emhp84jkv42c-2 0}ul.lst-kix_gfromclascha-7{list-style-type:none}ul.lst-kix_gfromclascha-8{list-style-type:none}ul.lst-kix_gfromclascha-5{list-style-type:none}ul.lst-kix_gfromclascha-6{list-style-type:none}.lst-kix_x1epm4iu41dp-8>li:before{content:"\0025a0 "}ul.lst-kix_gfromclascha-3{list-style-type:none}ul.lst-kix_gfromclascha-4{list-style-type:none}ul.lst-kix_gfromclascha-1{list-style-type:none}.lst-kix_bfzyeb917dp8-3>li:before{content:"" counter(lst-ctn-kix_bfzyeb917dp8-3,lower-latin) ") "}ul.lst-kix_gfromclascha-2{list-style-type:none}ul.lst-kix_opi66v2qdsjs-3{list-style-type:none}.lst-kix_x1epm4iu41dp-2>li:before{content:"\0025a0 "}ol.lst-kix_11a9ub9xa97v-1.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-1 0}ul.lst-kix_opi66v2qdsjs-2{list-style-type:none}ul.lst-kix_opi66v2qdsjs-1{list-style-type:none}ul.lst-kix_opi66v2qdsjs-0{list-style-type:none}.lst-kix_q8ok0mh9yyto-0>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-0,upper-roman) ". "}.lst-kix_fy6y7gyjejoh-3>li:before{content:"\0025cf "}.lst-kix_bfzyeb917dp8-5>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-5,lower-latin) ") "}.lst-kix_jj5w63toozfm-0>li{counter-increment:lst-ctn-kix_jj5w63toozfm-0}.lst-kix_x1epm4iu41dp-6>li:before{content:"\0025cf "}ul.lst-kix_opi66v2qdsjs-8{list-style-type:none}ul.lst-kix_opi66v2qdsjs-7{list-style-type:none}.lst-kix_x1epm4iu41dp-4>li:before{content:"\0025cb "}ul.lst-kix_opi66v2qdsjs-6{list-style-type:none}ul.lst-kix_opi66v2qdsjs-5{list-style-type:none}.lst-kix_fy6y7gyjejoh-1>li:before{content:"\0025cb "}ul.lst-kix_opi66v2qdsjs-4{list-style-type:none}.lst-kix_bfzyeb917dp8-7>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-7,lower-latin) ") "}.lst-kix_emhp84jkv42c-7>li{counter-increment:lst-ctn-kix_emhp84jkv42c-7}.lst-kix_fy6y7gyjejoh-7>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-1.start{counter-reset:lst-ctn-kix_xv318blpjdo-1 0}.lst-kix_x1epm4iu41dp-0>li:before{content:"\0025cf "}.lst-kix_fy6y7gyjejoh-5>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-3>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-3,lower-latin) ") "}.lst-kix_emhp84jkv42c-5>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-5,lower-latin) ") "}.lst-kix_emhp84jkv42c-1>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-1,upper-latin) ". "}.lst-kix_emhp84jkv42c-7>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-7,lower-latin) ") "}.lst-kix_jj5w63toozfm-5>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-5,lower-roman) ". "}.lst-kix_bfzyeb917dp8-2>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-2}ul.lst-kix_1qz6dmm9b14l-6{list-style-type:none}.lst-kix_gyhqddkw9i05-8>li:before{content:"\0025a0 "}.lst-kix_jj5w63toozfm-7>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-7,lower-latin) ". "}ul.lst-kix_1qz6dmm9b14l-5{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-8{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-7{list-style-type:none}.lst-kix_jj5w63toozfm-1>li{counter-increment:lst-ctn-kix_jj5w63toozfm-1}ul.lst-kix_1qz6dmm9b14l-2{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-1{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-4{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-3{list-style-type:none}.lst-kix_u0uqs69v9qbh-0>li:before{content:"\0025cf "}.lst-kix_u0uqs69v9qbh-4>li:before{content:"\0025cb "}ul.lst-kix_1qz6dmm9b14l-0{list-style-type:none}.lst-kix_s3mi7ukxwiwf-6>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-6}.lst-kix_jj5w63toozfm-7>li{counter-increment:lst-ctn-kix_jj5w63toozfm-7}.lst-kix_u0uqs69v9qbh-2>li:before{content:"\0025a0 "}.lst-kix_8p26nc4xx5n8-6>li:before{content:"\0025cf "}ol.lst-kix_1wulu3ra2vwv-4.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-4 0}.lst-kix_u0uqs69v9qbh-8>li:before{content:"\0025a0 "}.lst-kix_bfzyeb917dp8-1>li:before{content:"" counter(lst-ctn-kix_bfzyeb917dp8-1,upper-latin) ". "}ul.lst-kix_ekmayt81kvbz-8{list-style-type:none}.lst-kix_gyhqddkw9i05-0>li:before{content:"\0025cf "}ul.lst-kix_ekmayt81kvbz-7{list-style-type:none}.lst-kix_gyhqddkw9i05-4>li:before{content:"\0025cb "}.lst-kix_8p26nc4xx5n8-2>li:before{content:"\0025a0 "}ul.lst-kix_ekmayt81kvbz-6{list-style-type:none}ul.lst-kix_ekmayt81kvbz-5{list-style-type:none}ul.lst-kix_ekmayt81kvbz-4{list-style-type:none}ul.lst-kix_ekmayt81kvbz-3{list-style-type:none}.lst-kix_gyhqddkw9i05-6>li:before{content:"\0025cf "}.lst-kix_8p26nc4xx5n8-0>li:before{content:"\0025cf "}.lst-kix_8p26nc4xx5n8-8>li:before{content:"\0025a0 "}ul.lst-kix_ekmayt81kvbz-2{list-style-type:none}ul.lst-kix_ekmayt81kvbz-1{list-style-type:none}.lst-kix_u0uqs69v9qbh-6>li:before{content:"\0025cf "}ul.lst-kix_ekmayt81kvbz-0{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-1{list-style-type:none}ol.lst-kix_bfzyeb917dp8-5.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-5 0}ol.lst-kix_s3mi7ukxwiwf-2{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-0{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-1{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-5{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-2{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-6{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-3{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-0{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-4{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-5{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-6{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-3{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-7{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-4{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-8{list-style-type:none}.lst-kix_gyhqddkw9i05-2>li:before{content:"\0025a0 "}.lst-kix_8p26nc4xx5n8-4>li:before{content:"\0025cb "}ul.lst-kix_7tib3jrzu2u9-7{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-8{list-style-type:none}.lst-kix_xv318blpjdo-1>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-1,upper-latin) ". "}.lst-kix_xv318blpjdo-0>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-0,upper-roman) ". "}.lst-kix_h0kibz3smj6t-4>li:before{content:"\0025cb "}.lst-kix_1wulu3ra2vwv-1>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-1}.lst-kix_h0kibz3smj6t-7>li:before{content:"\0025cb "}.lst-kix_h0kibz3smj6t-8>li:before{content:"\0025a0 "}.lst-kix_11a9ub9xa97v-5>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-5}.lst-kix_opi66v2qdsjs-0>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-7>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-8>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-8,lower-roman) ") "}.lst-kix_xv318blpjdo-5>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-5,lower-latin) ") "}.lst-kix_h0kibz3smj6t-3>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-3>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-4>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-4>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-4,decimal) ") "}.lst-kix_h0kibz3smj6t-0>li:before{content:"\0025cf "}ol.lst-kix_11a9ub9xa97v-0.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-0 0}.lst-kix_s3mi7ukxwiwf-7>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-7}.lst-kix_q8ok0mh9yyto-3>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-3,lower-latin) ") "}.lst-kix_686a8e4qhxwx-8>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-6>li{counter-increment:lst-ctn-kix_emhp84jkv42c-6}.lst-kix_q8ok0mh9yyto-2>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-2,decimal) ". "}.lst-kix_q8ok0mh9yyto-6>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-6,lower-roman) ") "}.lst-kix_4m04az9jmmj8-2>li:before{content:"\0025a0 "}.lst-kix_4m04az9jmmj8-6>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-7>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-7,lower-latin) ") "}.lst-kix_4m04az9jmmj8-1>li:before{content:"\0025cb "}.lst-kix_4m04az9jmmj8-5>li:before{content:"\0025a0 "}.lst-kix_xv318blpjdo-4>li{counter-increment:lst-ctn-kix_xv318blpjdo-4}.lst-kix_x1epm4iu41dp-7>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-4>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-8>li:before{content:"\0025a0 "}.lst-kix_xv318blpjdo-6>li{counter-increment:lst-ctn-kix_xv318blpjdo-6}ol.lst-kix_jj5w63toozfm-1.start{counter-reset:lst-ctn-kix_jj5w63toozfm-1 0}.lst-kix_bfzyeb917dp8-4>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-4,decimal) ") "}.lst-kix_x1epm4iu41dp-3>li:before{content:"\0025cf "}.lst-kix_fd1rucpc9vz2-8>li:before{content:"\0025a0 "}.lst-kix_bfzyeb917dp8-8>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-8,lower-roman) ") "}.lst-kix_fy6y7gyjejoh-2>li:before{content:"\0025a0 "}.lst-kix_fy6y7gyjejoh-6>li:before{content:"\0025cf "}ol.lst-kix_1wulu3ra2vwv-8.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-8 0}ol.lst-kix_s3mi7ukxwiwf-6.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-6 0}ol.lst-kix_jj5w63toozfm-0.start{counter-reset:lst-ctn-kix_jj5w63toozfm-0 0}.lst-kix_emhp84jkv42c-2>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-2,decimal) ". "}.lst-kix_emhp84jkv42c-6>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-6,lower-roman) ") "}.lst-kix_686a8e4qhxwx-0>li:before{content:"\0025cf "}.lst-kix_ndaonzmgp8vn-5>li:before{content:"\0025a0 "}.lst-kix_9jxnjym0nges-3>li:before{content:"\0025cf "}.lst-kix_opi66v2qdsjs-7>li:before{content:"\0025cb "}.lst-kix_ndaonzmgp8vn-1>li:before{content:"\0025cb "}.lst-kix_gyhqddkw9i05-7>li:before{content:"\0025cb "}.lst-kix_jj5w63toozfm-6>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-6,decimal) ". "}.lst-kix_u0uqs69v9qbh-3>li:before{content:"\0025cf "}.lst-kix_fd1rucpc9vz2-0>li:before{content:"\0025cf "}.lst-kix_fd1rucpc9vz2-4>li:before{content:"\0025cb "}ol.lst-kix_s3mi7ukxwiwf-5.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-5 0}.lst-kix_opi66v2qdsjs-3>li:before{content:"\0025cf "}.lst-kix_8p26nc4xx5n8-3>li:before{content:"\0025cf "}.lst-kix_8p26nc4xx5n8-7>li:before{content:"\0025cb "}.lst-kix_u0uqs69v9qbh-7>li:before{content:"\0025cb "}.lst-kix_bfzyeb917dp8-0>li:before{content:"" counter(lst-ctn-kix_bfzyeb917dp8-0,upper-roman) ". "}.lst-kix_11a9ub9xa97v-1>li:before{content:"" counter(lst-ctn-kix_11a9ub9xa97v-1,upper-latin) ". "}.lst-kix_gyhqddkw9i05-3>li:before{content:"\0025cf "}.lst-kix_9jxnjym0nges-7>li:before{content:"\0025cb "}.lst-kix_11a9ub9xa97v-5>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-5,lower-latin) ") "}ol.lst-kix_11a9ub9xa97v-2.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-2 0}.lst-kix_s3mi7ukxwiwf-4>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-4}.lst-kix_7tib3jrzu2u9-4>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-4{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-7.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-7 0}ol.lst-kix_xv318blpjdo-5{list-style-type:none}ol.lst-kix_xv318blpjdo-6{list-style-type:none}ol.lst-kix_xv318blpjdo-7{list-style-type:none}ol.lst-kix_xv318blpjdo-0{list-style-type:none}ol.lst-kix_xv318blpjdo-1{list-style-type:none}.lst-kix_7tib3jrzu2u9-1>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-2{list-style-type:none}ol.lst-kix_xv318blpjdo-3{list-style-type:none}.lst-kix_q8ok0mh9yyto-6>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-6}ul.lst-kix_5anu1k9tsyak-7{list-style-type:none}.lst-kix_jj5w63toozfm-6>li{counter-increment:lst-ctn-kix_jj5w63toozfm-6}ul.lst-kix_5anu1k9tsyak-8{list-style-type:none}ul.lst-kix_5anu1k9tsyak-5{list-style-type:none}.lst-kix_11a9ub9xa97v-2>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-2}ol.lst-kix_1wulu3ra2vwv-0{list-style-type:none}ul.lst-kix_5anu1k9tsyak-6{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-1{list-style-type:none}ul.lst-kix_5anu1k9tsyak-3{list-style-type:none}ul.lst-kix_5anu1k9tsyak-4{list-style-type:none}ul.lst-kix_5anu1k9tsyak-1{list-style-type:none}.lst-kix_xv318blpjdo-3>li{counter-increment:lst-ctn-kix_xv318blpjdo-3}ul.lst-kix_5anu1k9tsyak-2{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-6{list-style-type:none}ul.lst-kix_5anu1k9tsyak-0{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-7{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-8{list-style-type:none}.lst-kix_7tib3jrzu2u9-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-8{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-2{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-3{list-style-type:none}.lst-kix_7tib3jrzu2u9-7>li:before{content:"\0025cb "}ol.lst-kix_1wulu3ra2vwv-4{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-5{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-5.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-5 0}ol.lst-kix_11a9ub9xa97v-7.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-7 0}ol.lst-kix_q8ok0mh9yyto-2.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-2 0}.lst-kix_11a9ub9xa97v-6>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-6}.lst-kix_5anu1k9tsyak-7>li:before{content:"\0025cb "}.lst-kix_j42a5dwgnqyq-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-2.start{counter-reset:lst-ctn-kix_xv318blpjdo-2 0}.lst-kix_1wulu3ra2vwv-4>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-4}.lst-kix_q8ok0mh9yyto-2>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-2}ol.lst-kix_jj5w63toozfm-4.start{counter-reset:lst-ctn-kix_jj5w63toozfm-4 0}.lst-kix_6qnkx7t1adn9-2>li:before{content:"\0025a0 "}.lst-kix_qeqyxe7gm97l-6>li:before{content:"\0025cf "}.lst-kix_qeqyxe7gm97l-4>li:before{content:"\0025cb "}.lst-kix_j42a5dwgnqyq-1>li:before{content:"\0025cb "}.lst-kix_qeqyxe7gm97l-1>li:before{content:"\0025cb "}.lst-kix_qeqyxe7gm97l-3>li:before{content:"\0025cf "}.lst-kix_j42a5dwgnqyq-4>li:before{content:"\0025cb "}ol.lst-kix_1wulu3ra2vwv-0.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-0 0}ol.lst-kix_q8ok0mh9yyto-7.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-7 0}.lst-kix_j42a5dwgnqyq-3>li:before{content:"\0025cf "}.lst-kix_jj5w63toozfm-2>li{counter-increment:lst-ctn-kix_jj5w63toozfm-2}ol.lst-kix_1wulu3ra2vwv-3.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-3 0}ol.lst-kix_q8ok0mh9yyto-0.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-0 0}.lst-kix_6qnkx7t1adn9-5>li:before{content:"\0025a0 "}.lst-kix_6qnkx7t1adn9-7>li:before{content:"\0025cb "}.lst-kix_iv2x96orjh4l-7>li:before{content:"\0025cb "}.lst-kix_ndaonzmgp8vn-6>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-1>li:before{content:"\0025cb "}.lst-kix_ndaonzmgp8vn-8>li:before{content:"\0025a0 "}.lst-kix_iv2x96orjh4l-1>li:before{content:"\0025cb "}.lst-kix_bfzyeb917dp8-8>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-8}.lst-kix_opi66v2qdsjs-4>li:before{content:"\0025cb "}.lst-kix_fd1rucpc9vz2-1>li:before{content:"\0025cb "}.lst-kix_fd1rucpc9vz2-3>li:before{content:"\0025cf "}.lst-kix_opi66v2qdsjs-6>li:before{content:"\0025cf "}ol.lst-kix_11a9ub9xa97v-4.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-4 0}.lst-kix_bfzyeb917dp8-1>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-1}.lst-kix_ndaonzmgp8vn-0>li:before{content:"\0025cf "}ol.lst-kix_jj5w63toozfm-6.start{counter-reset:lst-ctn-kix_jj5w63toozfm-6 0}ul.lst-kix_b7256qmdgo85-6{list-style-type:none}ul.lst-kix_b7256qmdgo85-7{list-style-type:none}.lst-kix_1wulu3ra2vwv-3>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-3}ul.lst-kix_b7256qmdgo85-8{list-style-type:none}ul.lst-kix_b7256qmdgo85-2{list-style-type:none}ul.lst-kix_b7256qmdgo85-3{list-style-type:none}.lst-kix_11a9ub9xa97v-4>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-4,decimal) ") "}ul.lst-kix_b7256qmdgo85-4{list-style-type:none}ul.lst-kix_b7256qmdgo85-5{list-style-type:none}.lst-kix_11a9ub9xa97v-2>li:before{content:"" counter(lst-ctn-kix_11a9ub9xa97v-2,decimal) ". "}.lst-kix_9jxnjym0nges-4>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-4>li:before{content:"\0025cb "}ul.lst-kix_b7256qmdgo85-0{list-style-type:none}ul.lst-kix_b7256qmdgo85-1{list-style-type:none}.lst-kix_9jxnjym0nges-6>li:before{content:"\0025cf "}.lst-kix_86hsx13ssqid-2>li:before{content:"\0025a0 "}.lst-kix_bfzyeb917dp8-5>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-5}.lst-kix_h0kibz3smj6t-6>li:before{content:"\0025cf "}.lst-kix_11a9ub9xa97v-3>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-3}ol.lst-kix_11a9ub9xa97v-5.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-5 0}ul.lst-kix_x1epm4iu41dp-0{list-style-type:none}ol.lst-kix_xv318blpjdo-0.start{counter-reset:lst-ctn-kix_xv318blpjdo-0 0}.lst-kix_jkgkf1u9sy0c-0>li:before{content:"\0025cf "}ul.lst-kix_x1epm4iu41dp-6{list-style-type:none}ul.lst-kix_x1epm4iu41dp-5{list-style-type:none}ul.lst-kix_x1epm4iu41dp-8{list-style-type:none}.lst-kix_jkgkf1u9sy0c-3>li:before{content:"\0025cf "}ul.lst-kix_x1epm4iu41dp-7{list-style-type:none}ul.lst-kix_x1epm4iu41dp-2{list-style-type:none}.lst-kix_xv318blpjdo-0>li{counter-increment:lst-ctn-kix_xv318blpjdo-0}ol.lst-kix_jj5w63toozfm-8.start{counter-reset:lst-ctn-kix_jj5w63toozfm-8 0}ul.lst-kix_x1epm4iu41dp-1{list-style-type:none}ul.lst-kix_x1epm4iu41dp-4{list-style-type:none}ul.lst-kix_x1epm4iu41dp-3{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-2.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-2 0}.lst-kix_686a8e4qhxwx-6>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-5>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-5}.lst-kix_h0kibz3smj6t-1>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-6>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-6,lower-roman) ") "}ul.lst-kix_86hsx13ssqid-3{list-style-type:none}ul.lst-kix_86hsx13ssqid-2{list-style-type:none}.lst-kix_xv318blpjdo-3>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-3,lower-latin) ") "}ul.lst-kix_86hsx13ssqid-5{list-style-type:none}ul.lst-kix_86hsx13ssqid-4{list-style-type:none}.lst-kix_686a8e4qhxwx-1>li:before{content:"\0025cb "}ul.lst-kix_86hsx13ssqid-1{list-style-type:none}.lst-kix_jkgkf1u9sy0c-8>li:before{content:"\0025a0 "}ul.lst-kix_86hsx13ssqid-0{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-0{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-1{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-2{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-3{list-style-type:none}.lst-kix_b7256qmdgo85-1>li:before{content:"\0025cb "}ul.lst-kix_86hsx13ssqid-7{list-style-type:none}ul.lst-kix_h9mjmxara98n-0{list-style-type:none}ul.lst-kix_86hsx13ssqid-6{list-style-type:none}ul.lst-kix_86hsx13ssqid-8{list-style-type:none}ul.lst-kix_h9mjmxara98n-3{list-style-type:none}.lst-kix_4m04az9jmmj8-8>li:before{content:"\0025a0 "}ul.lst-kix_fy6y7gyjejoh-8{list-style-type:none}ul.lst-kix_h9mjmxara98n-4{list-style-type:none}ul.lst-kix_h9mjmxara98n-1{list-style-type:none}ul.lst-kix_h9mjmxara98n-2{list-style-type:none}ul.lst-kix_h9mjmxara98n-7{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-4{list-style-type:none}ul.lst-kix_h9mjmxara98n-8{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-5{list-style-type:none}ul.lst-kix_h9mjmxara98n-5{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-6{list-style-type:none}ul.lst-kix_h9mjmxara98n-6{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-7{list-style-type:none}.lst-kix_b7256qmdgo85-6>li:before{content:"\0025cf "}ol.lst-kix_1wulu3ra2vwv-1.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-1 0}.lst-kix_q97rvvc7c69e-0>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-1>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-1,upper-latin) ". "}.lst-kix_4m04az9jmmj8-0>li:before{content:"\0025cf "}ol.lst-kix_11a9ub9xa97v-6.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-6 0}.lst-kix_q8ok0mh9yyto-4>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-4,decimal) ") "}.lst-kix_emhp84jkv42c-0>li{counter-increment:lst-ctn-kix_emhp84jkv42c-0}.lst-kix_q8ok0mh9yyto-5>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-5}.lst-kix_s3mi7ukxwiwf-1>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-1}.lst-kix_4m04az9jmmj8-3>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-7>li{counter-increment:lst-ctn-kix_xv318blpjdo-7}ol.lst-kix_xv318blpjdo-7.start{counter-reset:lst-ctn-kix_xv318blpjdo-7 0}.lst-kix_gfromclascha-1>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-7>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-3.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-3 0}.lst-kix_1wulu3ra2vwv-7>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-7}ul.lst-kix_fd1rucpc9vz2-0{list-style-type:none}.lst-kix_fy6y7gyjejoh-0>li:before{content:"\0025cf "}ul.lst-kix_fd1rucpc9vz2-1{list-style-type:none}ul.lst-kix_fd1rucpc9vz2-2{list-style-type:none}ul.lst-kix_fd1rucpc9vz2-3{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-6.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-6 0}ul.lst-kix_fd1rucpc9vz2-8{list-style-type:none}.lst-kix_bfzyeb917dp8-6>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-6,lower-roman) ") "}.lst-kix_6ril5iwt0fcl-3>li:before{content:"\0025cf "}ul.lst-kix_fd1rucpc9vz2-4{list-style-type:none}ul.lst-kix_fd1rucpc9vz2-5{list-style-type:none}ul.lst-kix_fd1rucpc9vz2-6{list-style-type:none}.lst-kix_fd1rucpc9vz2-6>li:before{content:"\0025cf "}ul.lst-kix_fd1rucpc9vz2-7{list-style-type:none}.lst-kix_5anu1k9tsyak-4>li:before{content:"\0025cb "}.lst-kix_s3mi7ukxwiwf-8>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-8}.lst-kix_iv2x96orjh4l-4>li:before{content:"\0025cb "}.lst-kix_s3mi7ukxwiwf-6>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-6,decimal) ". "}.lst-kix_fy6y7gyjejoh-8>li:before{content:"\0025a0 "}ol.lst-kix_xv318blpjdo-4.start{counter-reset:lst-ctn-kix_xv318blpjdo-4 0}.lst-kix_x1epm4iu41dp-1>li:before{content:"\0025cb "}.lst-kix_q97rvvc7c69e-8>li:before{content:"\0025a0 "}ol.lst-kix_xv318blpjdo-5.start{counter-reset:lst-ctn-kix_xv318blpjdo-5 0}ul.lst-kix_8p26nc4xx5n8-0{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-1{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-2{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-3{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-4{list-style-type:none}.lst-kix_emhp84jkv42c-0>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-0,upper-roman) ". "}.lst-kix_emhp84jkv42c-8>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-8,lower-roman) ") "}.lst-kix_9jxnjym0nges-1>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-5.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-5 0}.lst-kix_ndaonzmgp8vn-3>li:before{content:"\0025cf "}.lst-kix_jj5w63toozfm-8>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-8,lower-roman) ". "}.lst-kix_u0uqs69v9qbh-1>li:before{content:"\0025cb "}.lst-kix_opi66v2qdsjs-1>li:before{content:"\0025cb "}.lst-kix_11a9ub9xa97v-7>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-7,lower-latin) ") "}.lst-kix_8p26nc4xx5n8-5>li:before{content:"\0025a0 "}ol.lst-kix_xv318blpjdo-6.start{counter-reset:lst-ctn-kix_xv318blpjdo-6 0}.lst-kix_1wulu3ra2vwv-0>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-0}.lst-kix_gyhqddkw9i05-5>li:before{content:"\0025a0 "}ul.lst-kix_6qnkx7t1adn9-8{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-4.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-4 0}ul.lst-kix_6qnkx7t1adn9-7{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-5{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-6{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-6{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-5{list-style-type:none}.lst-kix_sholqrhc62dh-3>li:before{content:"\0025cf "}ul.lst-kix_8p26nc4xx5n8-7{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-4{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-8{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-3{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-2{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-1{list-style-type:none}.lst-kix_1wulu3ra2vwv-1>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-1,upper-latin) ". "}ul.lst-kix_6qnkx7t1adn9-0{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c1{margin-left:36pt;padding-top:6pt;padding-left:0pt;padding-bottom:0pt;line-height:1.2;orphans:2;widows:2;text-align:left}.c9{color:#ff5e0e;font-weight:700;text-decoration:none;vertical-align:baseline;font-size:18pt;font-family:"PT Sans Narrow";font-style:normal}.c21{color:#666666;font-weight:400;text-decoration:underline;vertical-align:baseline;font-size:11pt;font-family:"Trebuchet MS";font-style:normal}.c26{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c2{padding-top:6pt;padding-bottom:0pt;line-height:1.2;orphans:2;widows:2;text-align:left}.c10{padding-top:24pt;padding-bottom:0pt;line-height:1.3;page-break-after:avoid;text-align:left}.c4{margin-left:36pt;padding-top:0pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c18{margin-left:72pt;padding-top:0pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c24{padding-top:8pt;padding-bottom:0pt;line-height:1.2;page-break-after:avoid;text-align:left}.c0{font-size:9pt;font-family:"Consolas";color:#880000;font-weight:400}.c11{font-size:9pt;font-family:"Consolas";color:#666600;font-weight:400}.c17{color:#008575;font-weight:400;font-size:16pt;font-family:"PT Sans Narrow"}.c37{color:#695d46;font-weight:700;font-size:42pt;font-family:"PT Sans Narrow"}.c8{font-size:9pt;font-family:"Consolas";color:#006666;font-weight:400}.c29{padding-top:0pt;padding-bottom:0pt;line-height:1.2;text-align:left}.c25{font-size:9pt;font-family:"Consolas";color:#660066;font-weight:400}.c19{padding-top:16pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c36{font-size:18pt;font-family:"PT Sans Narrow";color:#ff5e0e;font-weight:700}.c35{font-size:9pt;font-family:"Consolas";color:#000088;font-weight:400}.c6{font-size:9pt;font-family:"Consolas";color:#000000;font-weight:400}.c13{text-decoration:none;vertical-align:baseline;font-size:11pt;font-style:normal}.c16{text-decoration:none;vertical-align:baseline;font-style:normal}.c31{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c27{font-weight:700;font-size:9pt;font-family:"Consolas"}.c3{font-family:"Open Sans";color:#695d46;font-weight:400}.c33{orphans:2;widows:2}.c15{color:#1155cc;text-decoration:underline}.c5{color:inherit;text-decoration:inherit}.c12{margin-left:72pt;padding-left:0pt}.c20{margin-left:36pt;padding-left:0pt}.c30{font-weight:400;font-family:"Arial"}.c14{font-weight:400;font-family:"Open Sans"}.c7{padding:0;margin:0}.c22{color:#000000}.c32{font-size:12pt}.c23{margin-left:36pt}.c34{font-size:8pt}.c28{margin-left:72pt}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left} 

Oracle Fusion Middleware Deployments Using Docker Swarm Part II

Overview

This is the second in a series of blogs that describe how to build a Fusion Middleware (FMW) Cluster that runs as a number of Docker images that run in docker containers.  These containers are coordinated using Docker Swarm and can be deployed to a single host machine or multiple hosts.  This simplifies the task of building FMW clusters and also makes it easier to scale them in and out (adding or subtracting host machines) as well as up and down (using bigger or smaller host machines).

This blog uses Oracle Service Bus as an FMW product but the principles are applicable to other FMW products.

In our previous blog we talked about the overall requirements for running FMW on Docker Swarm and sketched out our overall approach.

In this entry we will explain the concepts of using Docker base images and create an Oracle database image and an Oracle Service Bus image.  The next blog will cover how to create an OSB domain and how to run this in Docker Swarm.

Notes on Building on Existing Docker Images

Docker allows you to create a new image by basing it on an existing image.  The “FROM” instruction in a dockerfile tells docker the base image that you are using as your foundation.  We will build a number of database base images that can then be reused later.

A docker image is a set of files and configuration.  A docker image runs in a docker container.  So a single image may be running in zero, one or more containers.  Think of the image as the software and configuration, think of the container as the active running image.

The diagram shows the images that we will build and their base images referenced in the FROM instruction.


Docker FMW Image Dependencies

The solid lines indicate the image reference by the FROM command in the dockerfile used to create an image.  The dotted lines represent dependencies on other images.

More details on the images will be given in the next section, but the following bullets explain how they work.  Note that we can store the created images in a company docker registry so that they can be reused.

  • Oracle Linux is an image that we use as our starting point.  This is available from github along with instructions (dockerfiles) to create the other images.
  • Oracle Database image is created by installing the Oracle database binaries into the Oracle Linux image.  This image can be used to create databases with different characteristics, such as different character sets, different service and instance names etc.
  • An Oracle Database Instance is created by running the database configuration assistant in a container created from the Oracle Database image.
  • JDK 8 image is created by installing a JDK 8 into the generic Linux image, this could be reused by any software requiring Java.
  • Fusion Middleware Infrastructure image is created by installing the WebLogic Fusion Middleware Infrastructure into the JDK image.  This provides WebLogic and some additional Oracle infrastructure files that are used by Fusion Middleware.  This image can be reused by any Fusion Middleware product image.
  • Oracle Service Bus image provides us with Service Bus installation on top of the Fusion Middleware Infrastructure image.  This provides a software only installation, no domain is created so the image can be used to create any desired Service Bus domain configuration.
  • Service Bus Domain image is the image where we run the domain configuration utility to create a Service Bus domain.  Prior to running the domain configuration wizard the FMW repository configuration utility is run against the database container created from the Oracle Database Instance image.  Depending on the options chosen this could be pointed to and used by a number of different FMW components.  In our case we will install the SOA schemas. We need to refer to the Oracle Database Container to be able to run the RCU and also to complete the domain creation.  Different run commands are used to start a container to run either the Admin Server or a Managed Server.
Retrieving Docker Files for OSB Cluster

We are posting all the required files to go along with this blog on github.  You are welcome to fork from this and improve it.  We cloned many of these files from the official Oracle docker github.  We removed unused versions and added a simplified build.sh file to each product directory to make it easy to see how we actually built our environment.  We are still updating the files online and will shortly add details on building the service bus cluster.  We made the following additional changes to the standard Oracle files:

  • Java - we used the JDK rather than the JRE.
  • WebLogic - we added a 12.2.1.2 FMW Infrastructure alongside the generic and developer options.  This is available in other versions of the Oracle files but not in the 12.2.1.2 files.
  • OSB and SOA - Added OSB and SOA directories along with their associated files.
Database Creation

Because Oracle Fusion Middleware relies on a database we need to create a database image.  Once we have created the database then we need to create the FMW schemas within it by running the Repository Creation Utility.  The Repository Creation Utility is only available in the FMW installed code, so to create the schemas we also need to install our FMW component, in our case Service Bus.  The steps we will follow to build, create and configure the database are as follows:

  1. Build Oracle Database image using the Oracle provided database dockerfile.
  2. Create an Oracle Database Instance by creating a docker container and using the provided scripts to initialize the container with a database instance.

Detailed instructions to build the database image are provided in the section “Oracle Database Build Steps

We create the database instance in a docker container rather than baking it into an image because we only want to run a single instance of the database container.

FMW Installation

We will use multiple layered images to get to our FMW install image.  Each image is kept separate to make it flexible and reusable.  For example given the WebLogic FMW Infrastructure image we could create separate FMW images for SOA Suite, WebCenter and Business Intelligence for example.

  • We will install JDK 8 to create a JDK 8 image.  This can be used to create any image requiring a JDK 8 installation.  This if built on top of the Oracle Linux 7 image.
  • We build on top of the JDK 8 image to install Fusion Middleware Infrastructure into a WebLogic FMW Infrastructure image.  This can be used as the basis of any FMW images in the future.
  • In our example we install SOA or OSB on top of the WebLogic FMW Infrastructure image as our FMW component.  This does not create a domain.  It just installs the software.

Detailed steps are given in the sections “Weblogic Docker Image Build Steps” and “OSB Docker Image Build steps

General Build Instructions

You can download our dockerfiles by cloning our github onto your build machine.

git clone https://github.com/Shuxuan/OSB-Docker-Swarm.git

This will create a directory OSB-Docker-Swarm.  We will refer to the location of this as <MASTER> in subsequent instructions.

Database Docker Image Build Steps

There is an excellent blog on Creating an Oracle Database Docker image by Gerald Venzi that covers everything.  We have provided a minimal description of the steps here only to be self contained.

  1. Get Oracle Database Binaries

Retrieve the Oracle 12.1.0.2 binaries from OTN http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

  • linuxamd64_12102_database_1of2.zip
  • linuxamd64_12102_database_2of2.zip

  and place them at <MASTER>/OracleDatabase/dockerfiles/12.1.0.2.

  1. Build Oracle Database Docker Image
  • Create a Docker Image for the database using the binaries from the previous step.  This installs the database binaries and saves the result as a docker image.  The build.sh has all the paramters needed by the dockerfile, if you are interested in what they do check out the official Oracle docker database image docs.  Note that if we don’t have the Oracle Linux image then the build process will retrieve it from docker hub.

<MASTER>/OracleDatabase/build.sh

  • Check the image has been built properly by making sure it is listed by the docker images command.

$ docker images

REPOSITORY      TAG         IMAGE ID      CREATED         SIZE

oracle/database 12.1.0.2-ee 8f0f3c5f4170  49 seconds ago  11.24 GB

oraclelinux     latest      27a5201e554e  3 weeks ago     225.1 MB

  1. Create Oracle Database
  • Run a docker container based on the previously built docker image to create the database instance.  The create_db.sh command that we provide will do this.  Again the details of how it works are in the official Oracle docker database image docs.  We also added a -d parameter to run the container in the background.

./create_db.sh

  • Check container logs
    docker logs <container_id>
  • Change DB password by running the set_db_password.sh we provide which sets the database password to be FMWDocker.  You can edit the file to change the password.  We also modified this file to set the password policy to not expire the passwords.

./set_db_password.sh

We now have an Oracle database instance running in a docker container.

Weblogic Docker Image Build Steps
  1. Build JDK 1.8 Docker image based on base image
  • Go to <MASTER>/oraclejdk8 folder
  • Download jdk 8 install binary file, jdk-8uXXX-linux-x64.tar.gz from OTN into oraclejdk8 folder.  Any version that starts jdk-8 should work.
  • Run build.sh

./build.sh

  • Check that image has been created

$ docker images

REPOSITORY       TAG          IMAGE ID      CREATED         SIZE

oracle/database  12.1.0.2-ee  086a4a3541bc  34 minutes ago  11.24 GB

oracle/serverjdk 8            85aebb7b773e  22 hours ago    590.4 MB

oraclelinux      latest       27a5201e554e  3 weeks ago     225.1 MB

This JDK image is then used as a base for future images.

  1. Build Weblogic 12.2.1.2 installation image based on JDK 1.8 image
  • Go to folder <MASTER>/wls12.2.1.2
  • Download fmw_12.2.1.2.0_infrastructure_Disk1_1of1.zip from OTN to folder wls12.2.1.2
  • Run build.sh

./build.sh

  • Run docker images to check the image created in the above steps

$ docker images

REPOSITORY        TAG                      IMAGE ID     CREATED              SIZE

oracle/weblogic   12.2.1.2-infrastructure  9eceea30c474 About a minute ago   4.096 GB

oracle/database   12.1.0.2-ee              086a4a3541bc About an hour ago    11.24 GB

oracle/serverjdk  8                        85aebb7b773e 22 hours ago         590.4 MB

oraclelinux       latest                   27a5201e554e 3 weeks ago          225.1 MB

This gives us our FMW infrastructure docker image.

OSB Docker Image Build steps
  • Go to folder <MASTER>/osb
  • Download fmw_12.2.1.2.0_osb.jar from OTN to folder osb.  If unavailable on OTN it is available from e-delivery if you have a Service Bus license.
  • Run build.sh

./build.sh

  • Check docker image built in the above step

$ docker images

REPOSITORY        TAG                     IMAGE ID     CREATED             SIZE

oracle/osb        12.2.1.2                59021dc16e40 5 minutes ago       7.231 GB

oracle/weblogic   12.2.1.2-infrastructure 9eceea30c474 12 minutes ago      4.096 GB

oracle/database   12.1.0.2-ee             086a4a3541bc About an hour ago   11.24 GB

oracle/serverjdk  8                       85aebb7b773e 23 hours ago        590.4 MB

oraclelinux       latest                  27a5201e554e 3 weeks ago         225.1 MB

This gives us our FMW product docker image, in our case service bus.  We also provided SOA Suite dockerfiles in the git repository.

Summary

In this entry we have explained how to install Fusion Middleware and Oracle Database as Docker images, and how to create a Database container.  In our next entry we will use these images to create a cluster in swarm mode by defining swarm services for the database, WebLogic Admin Server and WebLogic managed servers.

Building an FMW Cluster using Docker (Part I Introduction)

Sat, 2017-01-14 21:19

Click here for a Google Docs version of this document that doesn't suffer from the Oracle blog formatting problems

@import url('https://themes.googleusercontent.com/fonts/css?kit=iMc4-4exjgqA-toZgqqJBapXv4aEsWUJfLHj8vTDOv6sKTypj6oMABt6aLc3fm-oS8WuZCZU7xsrLLn8Eq5Dllll7szA_gjBFRwwth-OR18');.lst-kix_sholqrhc62dh-7>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-8>li:before{content:"\0025a0 "}.lst-kix_sholqrhc62dh-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-3.start{counter-reset:lst-ctn-kix_xv318blpjdo-3 0}ul.lst-kix_bijol4nzhwf0-8{list-style-type:none}.lst-kix_sholqrhc62dh-1>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-0>li:before{content:"\0025cf "}ol.lst-kix_emhp84jkv42c-0{list-style-type:none}.lst-kix_emhp84jkv42c-3>li{counter-increment:lst-ctn-kix_emhp84jkv42c-3}ol.lst-kix_emhp84jkv42c-2{list-style-type:none}ol.lst-kix_emhp84jkv42c-1{list-style-type:none}ol.lst-kix_emhp84jkv42c-4{list-style-type:none}ol.lst-kix_emhp84jkv42c-3{list-style-type:none}ol.lst-kix_emhp84jkv42c-6{list-style-type:none}ol.lst-kix_emhp84jkv42c-5{list-style-type:none}ol.lst-kix_emhp84jkv42c-8{list-style-type:none}ol.lst-kix_emhp84jkv42c-7{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-0{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-1{list-style-type:none}ul.lst-kix_4m04az9jmmj8-3{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-2{list-style-type:none}ul.lst-kix_4m04az9jmmj8-2{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-3{list-style-type:none}ul.lst-kix_4m04az9jmmj8-1{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-4{list-style-type:none}ul.lst-kix_4m04az9jmmj8-0{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-5{list-style-type:none}ul.lst-kix_4m04az9jmmj8-7{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-6{list-style-type:none}ul.lst-kix_4m04az9jmmj8-6{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-7{list-style-type:none}ul.lst-kix_4m04az9jmmj8-5{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-8{list-style-type:none}ul.lst-kix_4m04az9jmmj8-4{list-style-type:none}ul.lst-kix_4m04az9jmmj8-8{list-style-type:none}ul.lst-kix_bijol4nzhwf0-4{list-style-type:none}.lst-kix_s3mi7ukxwiwf-2>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-2}ul.lst-kix_bijol4nzhwf0-5{list-style-type:none}ul.lst-kix_bijol4nzhwf0-6{list-style-type:none}ul.lst-kix_bijol4nzhwf0-7{list-style-type:none}ul.lst-kix_bijol4nzhwf0-0{list-style-type:none}ul.lst-kix_bijol4nzhwf0-1{list-style-type:none}ul.lst-kix_bijol4nzhwf0-2{list-style-type:none}ul.lst-kix_bijol4nzhwf0-3{list-style-type:none}.lst-kix_1wulu3ra2vwv-2>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-2}.lst-kix_q8ok0mh9yyto-4>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-4}.lst-kix_bijol4nzhwf0-7>li:before{content:"\0025cb "}.lst-kix_bijol4nzhwf0-6>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-8>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-5>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-3>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-2>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-4>li:before{content:"\0025cb "}ol.lst-kix_emhp84jkv42c-4.start{counter-reset:lst-ctn-kix_emhp84jkv42c-4 0}ol.lst-kix_xv318blpjdo-8.start{counter-reset:lst-ctn-kix_xv318blpjdo-8 0}.lst-kix_q8ok0mh9yyto-8>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-8}ol.lst-kix_q8ok0mh9yyto-1.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-1 0}ol.lst-kix_s3mi7ukxwiwf-8.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-8 0}ol.lst-kix_s3mi7ukxwiwf-1.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-1 0}.lst-kix_bijol4nzhwf0-0>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-1>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-1>li{counter-increment:lst-ctn-kix_xv318blpjdo-1}ul.lst-kix_gfromclascha-0{list-style-type:none}ol.lst-kix_emhp84jkv42c-2.start{counter-reset:lst-ctn-kix_emhp84jkv42c-2 0}.lst-kix_s3mi7ukxwiwf-1>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-1,lower-latin) ". "}.lst-kix_gfromclascha-0>li:before{content:"\0025cf "}.lst-kix_gfromclascha-2>li:before{content:"\0025a0 "}.lst-kix_gfromclascha-4>li:before{content:"\0025cb "}ul.lst-kix_gfromclascha-7{list-style-type:none}ul.lst-kix_gfromclascha-8{list-style-type:none}ul.lst-kix_gfromclascha-5{list-style-type:none}.lst-kix_gfromclascha-6>li:before{content:"\0025cf "}ul.lst-kix_gfromclascha-6{list-style-type:none}ul.lst-kix_gfromclascha-3{list-style-type:none}ul.lst-kix_gfromclascha-4{list-style-type:none}ul.lst-kix_gfromclascha-1{list-style-type:none}ul.lst-kix_gfromclascha-2{list-style-type:none}ul.lst-kix_opi66v2qdsjs-3{list-style-type:none}ul.lst-kix_opi66v2qdsjs-2{list-style-type:none}ul.lst-kix_opi66v2qdsjs-1{list-style-type:none}ul.lst-kix_opi66v2qdsjs-0{list-style-type:none}.lst-kix_q97rvvc7c69e-5>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-7>li:before{content:"\0025cb "}.lst-kix_q8ok0mh9yyto-0>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-0,upper-roman) ". "}ol.lst-kix_q8ok0mh9yyto-8.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-8 0}.lst-kix_fy6y7gyjejoh-3>li:before{content:"\0025cf "}ul.lst-kix_opi66v2qdsjs-8{list-style-type:none}.lst-kix_q97rvvc7c69e-3>li:before{content:"\0025cf "}ul.lst-kix_opi66v2qdsjs-7{list-style-type:none}ul.lst-kix_opi66v2qdsjs-6{list-style-type:none}ul.lst-kix_opi66v2qdsjs-5{list-style-type:none}.lst-kix_fy6y7gyjejoh-1>li:before{content:"\0025cb "}ul.lst-kix_opi66v2qdsjs-4{list-style-type:none}.lst-kix_s3mi7ukxwiwf-7>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-7,lower-latin) ". "}.lst-kix_xv318blpjdo-8>li{counter-increment:lst-ctn-kix_xv318blpjdo-8}.lst-kix_emhp84jkv42c-7>li{counter-increment:lst-ctn-kix_emhp84jkv42c-7}.lst-kix_s3mi7ukxwiwf-5>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-5,lower-roman) ". "}.lst-kix_fy6y7gyjejoh-7>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-1.start{counter-reset:lst-ctn-kix_xv318blpjdo-1 0}.lst-kix_fy6y7gyjejoh-5>li:before{content:"\0025a0 "}.lst-kix_s3mi7ukxwiwf-3>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-3,decimal) ". "}.lst-kix_emhp84jkv42c-3>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-3,lower-latin) ") "}.lst-kix_emhp84jkv42c-5>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-5,lower-latin) ") "}.lst-kix_emhp84jkv42c-1>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-1,upper-latin) ". "}.lst-kix_emhp84jkv42c-7>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-7,lower-latin) ") "}.lst-kix_1wulu3ra2vwv-4>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-4,decimal) ") "}.lst-kix_1wulu3ra2vwv-6>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-6,lower-roman) ") "}.lst-kix_s3mi7ukxwiwf-6>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-6}.lst-kix_1wulu3ra2vwv-8>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-8,lower-roman) ") "}ol.lst-kix_1wulu3ra2vwv-4.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-4 0}.lst-kix_gfromclascha-8>li:before{content:"\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-1{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-2{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-0{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-1{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-5{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-2{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-6{list-style-type:none}.lst-kix_sholqrhc62dh-2>li:before{content:"\0025a0 "}ul.lst-kix_9jxnjym0nges-0{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-3{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-0{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-4{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-5{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-6{list-style-type:none}.lst-kix_sholqrhc62dh-4>li:before{content:"\0025cb "}.lst-kix_1wulu3ra2vwv-2>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-2,decimal) ". "}ul.lst-kix_7tib3jrzu2u9-3{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-7{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-4{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-8{list-style-type:none}.lst-kix_1wulu3ra2vwv-0>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-0,upper-roman) ". "}ul.lst-kix_7tib3jrzu2u9-7{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-8{list-style-type:none}.lst-kix_emhp84jkv42c-2>li{counter-increment:lst-ctn-kix_emhp84jkv42c-2}ol.lst-kix_s3mi7ukxwiwf-4.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-4 0}.lst-kix_xv318blpjdo-1>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-1,upper-latin) ". "}.lst-kix_xv318blpjdo-0>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-0,upper-roman) ". "}ol.lst-kix_1wulu3ra2vwv-7.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-7 0}.lst-kix_1wulu3ra2vwv-1>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-1}.lst-kix_jkgkf1u9sy0c-2>li:before{content:"\0025a0 "}.lst-kix_jkgkf1u9sy0c-1>li:before{content:"\0025cb "}.lst-kix_opi66v2qdsjs-0>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-7>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-8>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-8,lower-roman) ") "}.lst-kix_xv318blpjdo-5>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-5,lower-latin) ") "}.lst-kix_jkgkf1u9sy0c-5>li:before{content:"\0025a0 "}.lst-kix_686a8e4qhxwx-3>li:before{content:"\0025cf "}.lst-kix_jkgkf1u9sy0c-6>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-4>li:before{content:"\0025cb "}.lst-kix_emhp84jkv42c-4>li{counter-increment:lst-ctn-kix_emhp84jkv42c-4}.lst-kix_xv318blpjdo-4>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-4,decimal) ") "}.lst-kix_s3mi7ukxwiwf-7>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-7}.lst-kix_q97rvvc7c69e-2>li:before{content:"\0025a0 "}.lst-kix_q8ok0mh9yyto-3>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-3,lower-latin) ") "}.lst-kix_686a8e4qhxwx-8>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-6>li{counter-increment:lst-ctn-kix_emhp84jkv42c-6}.lst-kix_q8ok0mh9yyto-2>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-2,decimal) ". "}ol.lst-kix_1wulu3ra2vwv-6.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-6 0}.lst-kix_q8ok0mh9yyto-6>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-6,lower-roman) ") "}.lst-kix_4m04az9jmmj8-2>li:before{content:"\0025a0 "}.lst-kix_4m04az9jmmj8-6>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-7>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-7,lower-latin) ") "}.lst-kix_4m04az9jmmj8-1>li:before{content:"\0025cb "}.lst-kix_4m04az9jmmj8-5>li:before{content:"\0025a0 "}.lst-kix_xv318blpjdo-4>li{counter-increment:lst-ctn-kix_xv318blpjdo-4}.lst-kix_s3mi7ukxwiwf-0>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-0,decimal) ". "}ul.lst-kix_q97rvvc7c69e-4{list-style-type:none}ul.lst-kix_q97rvvc7c69e-3{list-style-type:none}ul.lst-kix_q97rvvc7c69e-6{list-style-type:none}.lst-kix_s3mi7ukxwiwf-8>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-8,lower-roman) ". "}ul.lst-kix_q97rvvc7c69e-5{list-style-type:none}ul.lst-kix_q97rvvc7c69e-8{list-style-type:none}ul.lst-kix_q97rvvc7c69e-7{list-style-type:none}.lst-kix_6qnkx7t1adn9-4>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-8>li:before{content:"\0025a0 "}.lst-kix_gfromclascha-3>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-6>li{counter-increment:lst-ctn-kix_xv318blpjdo-6}ul.lst-kix_q97rvvc7c69e-0{list-style-type:none}ul.lst-kix_q97rvvc7c69e-2{list-style-type:none}ul.lst-kix_q97rvvc7c69e-1{list-style-type:none}.lst-kix_q97rvvc7c69e-6>li:before{content:"\0025cf "}ol.lst-kix_s3mi7ukxwiwf-3.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-3 0}.lst-kix_fy6y7gyjejoh-2>li:before{content:"\0025a0 "}.lst-kix_fy6y7gyjejoh-6>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-1>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-1}ol.lst-kix_1wulu3ra2vwv-8.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-8 0}.lst-kix_s3mi7ukxwiwf-4>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-4,lower-latin) ". "}.lst-kix_5anu1k9tsyak-2>li:before{content:"\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-6.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-6 0}.lst-kix_emhp84jkv42c-2>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-2,decimal) ". "}.lst-kix_emhp84jkv42c-6>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-6,lower-roman) ") "}.lst-kix_686a8e4qhxwx-0>li:before{content:"\0025cf "}.lst-kix_1wulu3ra2vwv-3>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-3,lower-latin) ") "}.lst-kix_9jxnjym0nges-3>li:before{content:"\0025cf "}.lst-kix_opi66v2qdsjs-7>li:before{content:"\0025cb "}.lst-kix_1wulu3ra2vwv-7>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-7,lower-latin) ") "}ol.lst-kix_s3mi7ukxwiwf-5.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-5 0}.lst-kix_opi66v2qdsjs-3>li:before{content:"\0025cf "}.lst-kix_1wulu3ra2vwv-6>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-6}.lst-kix_gfromclascha-7>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-5>li:before{content:"\0025a0 "}.lst-kix_9jxnjym0nges-7>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-1>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-5>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-0>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-4>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-4}.lst-kix_7tib3jrzu2u9-4>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-4{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-7.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-7 0}ol.lst-kix_xv318blpjdo-5{list-style-type:none}ol.lst-kix_xv318blpjdo-6{list-style-type:none}ol.lst-kix_xv318blpjdo-7{list-style-type:none}ol.lst-kix_xv318blpjdo-0{list-style-type:none}ol.lst-kix_xv318blpjdo-1{list-style-type:none}.lst-kix_7tib3jrzu2u9-1>li:before{content:"\0025cb "}.lst-kix_7tib3jrzu2u9-5>li:before{content:"\0025a0 "}ol.lst-kix_xv318blpjdo-2{list-style-type:none}ol.lst-kix_xv318blpjdo-3{list-style-type:none}.lst-kix_q8ok0mh9yyto-6>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-6}.lst-kix_7tib3jrzu2u9-2>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-3>li:before{content:"\0025cf "}ul.lst-kix_5anu1k9tsyak-7{list-style-type:none}ul.lst-kix_5anu1k9tsyak-8{list-style-type:none}ul.lst-kix_5anu1k9tsyak-5{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-0{list-style-type:none}ul.lst-kix_5anu1k9tsyak-6{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-1{list-style-type:none}ul.lst-kix_5anu1k9tsyak-3{list-style-type:none}ul.lst-kix_5anu1k9tsyak-4{list-style-type:none}ul.lst-kix_5anu1k9tsyak-1{list-style-type:none}.lst-kix_xv318blpjdo-3>li{counter-increment:lst-ctn-kix_xv318blpjdo-3}ul.lst-kix_5anu1k9tsyak-2{list-style-type:none}.lst-kix_7tib3jrzu2u9-8>li:before{content:"\0025a0 "}ul.lst-kix_sholqrhc62dh-6{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-6{list-style-type:none}ul.lst-kix_5anu1k9tsyak-0{list-style-type:none}ul.lst-kix_sholqrhc62dh-5{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-7{list-style-type:none}ul.lst-kix_sholqrhc62dh-4{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-8{list-style-type:none}ul.lst-kix_sholqrhc62dh-3{list-style-type:none}.lst-kix_7tib3jrzu2u9-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-8{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-2{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-3{list-style-type:none}.lst-kix_7tib3jrzu2u9-7>li:before{content:"\0025cb "}ul.lst-kix_sholqrhc62dh-8{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-4{list-style-type:none}ul.lst-kix_sholqrhc62dh-7{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-5{list-style-type:none}ul.lst-kix_sholqrhc62dh-2{list-style-type:none}ul.lst-kix_sholqrhc62dh-1{list-style-type:none}ul.lst-kix_sholqrhc62dh-0{list-style-type:none}.lst-kix_emhp84jkv42c-1>li{counter-increment:lst-ctn-kix_emhp84jkv42c-1}ol.lst-kix_1wulu3ra2vwv-5.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-5 0}.lst-kix_j42a5dwgnqyq-8>li:before{content:"\0025a0 "}ol.lst-kix_q8ok0mh9yyto-2.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-2 0}.lst-kix_5anu1k9tsyak-7>li:before{content:"\0025cb "}.lst-kix_j42a5dwgnqyq-6>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-6>li:before{content:"\0025cf "}.lst-kix_j42a5dwgnqyq-7>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-2.start{counter-reset:lst-ctn-kix_xv318blpjdo-2 0}.lst-kix_1wulu3ra2vwv-4>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-4}.lst-kix_5anu1k9tsyak-8>li:before{content:"\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-2.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-2 0}ul.lst-kix_686a8e4qhxwx-4{list-style-type:none}ul.lst-kix_686a8e4qhxwx-3{list-style-type:none}ul.lst-kix_686a8e4qhxwx-2{list-style-type:none}.lst-kix_q8ok0mh9yyto-2>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-2}ul.lst-kix_686a8e4qhxwx-1{list-style-type:none}ul.lst-kix_686a8e4qhxwx-8{list-style-type:none}ul.lst-kix_686a8e4qhxwx-7{list-style-type:none}ul.lst-kix_686a8e4qhxwx-6{list-style-type:none}.lst-kix_6qnkx7t1adn9-0>li:before{content:"\0025cf "}ul.lst-kix_686a8e4qhxwx-5{list-style-type:none}.lst-kix_6qnkx7t1adn9-1>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-3>li:before{content:"\0025cf "}ul.lst-kix_686a8e4qhxwx-0{list-style-type:none}.lst-kix_6qnkx7t1adn9-2>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-0>li:before{content:"\0025cf "}.lst-kix_j42a5dwgnqyq-2>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-1>li:before{content:"\0025cb "}.lst-kix_j42a5dwgnqyq-5>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-4>li:before{content:"\0025cb "}ol.lst-kix_1wulu3ra2vwv-0.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-0 0}ol.lst-kix_q8ok0mh9yyto-7.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-7 0}ol.lst-kix_emhp84jkv42c-3.start{counter-reset:lst-ctn-kix_emhp84jkv42c-3 0}.lst-kix_j42a5dwgnqyq-3>li:before{content:"\0025cf "}.lst-kix_emhp84jkv42c-8>li{counter-increment:lst-ctn-kix_emhp84jkv42c-8}ol.lst-kix_1wulu3ra2vwv-3.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-3 0}ol.lst-kix_q8ok0mh9yyto-0.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-0 0}.lst-kix_6qnkx7t1adn9-5>li:before{content:"\0025a0 "}.lst-kix_6qnkx7t1adn9-7>li:before{content:"\0025cb "}ol.lst-kix_s3mi7ukxwiwf-0.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-0 0}.lst-kix_86hsx13ssqid-8>li:before{content:"\0025a0 "}.lst-kix_s3mi7ukxwiwf-0>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-0}.lst-kix_5anu1k9tsyak-3>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-5>li:before{content:"\0025a0 "}.lst-kix_1wulu3ra2vwv-8>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-8}.lst-kix_5anu1k9tsyak-1>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-6{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-5{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-4{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-3{list-style-type:none}.lst-kix_9jxnjym0nges-0>li:before{content:"\0025cf "}ol.lst-kix_q8ok0mh9yyto-8{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-7{list-style-type:none}ol.lst-kix_emhp84jkv42c-0.start{counter-reset:lst-ctn-kix_emhp84jkv42c-0 0}.lst-kix_opi66v2qdsjs-8>li:before{content:"\0025a0 "}ol.lst-kix_q8ok0mh9yyto-2{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-1{list-style-type:none}.lst-kix_9jxnjym0nges-2>li:before{content:"\0025a0 "}ol.lst-kix_q8ok0mh9yyto-0{list-style-type:none}.lst-kix_opi66v2qdsjs-4>li:before{content:"\0025cb "}.lst-kix_opi66v2qdsjs-2>li:before{content:"\0025a0 "}.lst-kix_opi66v2qdsjs-6>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-3>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-3}.lst-kix_1wulu3ra2vwv-3>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-3}.lst-kix_86hsx13ssqid-0>li:before{content:"\0025cf "}.lst-kix_86hsx13ssqid-6>li:before{content:"\0025cf "}.lst-kix_9jxnjym0nges-4>li:before{content:"\0025cb "}.lst-kix_9jxnjym0nges-8>li:before{content:"\0025a0 "}.lst-kix_86hsx13ssqid-4>li:before{content:"\0025cb "}.lst-kix_9jxnjym0nges-6>li:before{content:"\0025cf "}.lst-kix_86hsx13ssqid-2>li:before{content:"\0025a0 "}ul.lst-kix_9jxnjym0nges-2{list-style-type:none}.lst-kix_xv318blpjdo-2>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-2,decimal) ". "}ul.lst-kix_9jxnjym0nges-1{list-style-type:none}ul.lst-kix_9jxnjym0nges-4{list-style-type:none}ul.lst-kix_9jxnjym0nges-3{list-style-type:none}ul.lst-kix_9jxnjym0nges-6{list-style-type:none}ul.lst-kix_9jxnjym0nges-5{list-style-type:none}ul.lst-kix_9jxnjym0nges-8{list-style-type:none}ul.lst-kix_9jxnjym0nges-7{list-style-type:none}.lst-kix_xv318blpjdo-2>li{counter-increment:lst-ctn-kix_xv318blpjdo-2}.lst-kix_s3mi7ukxwiwf-3>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-3}ol.lst-kix_xv318blpjdo-0.start{counter-reset:lst-ctn-kix_xv318blpjdo-0 0}.lst-kix_jkgkf1u9sy0c-0>li:before{content:"\0025cf "}.lst-kix_jkgkf1u9sy0c-3>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-0>li{counter-increment:lst-ctn-kix_xv318blpjdo-0}ol.lst-kix_emhp84jkv42c-1.start{counter-reset:lst-ctn-kix_emhp84jkv42c-1 0}.lst-kix_jkgkf1u9sy0c-4>li:before{content:"\0025cb "}ol.lst-kix_1wulu3ra2vwv-2.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-2 0}.lst-kix_686a8e4qhxwx-6>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-5>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-5}.lst-kix_jkgkf1u9sy0c-7>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-7>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-7,lower-latin) ") "}.lst-kix_686a8e4qhxwx-5>li:before{content:"\0025a0 "}.lst-kix_xv318blpjdo-6>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-6,lower-roman) ") "}.lst-kix_q8ok0mh9yyto-7>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-7}ul.lst-kix_86hsx13ssqid-3{list-style-type:none}ul.lst-kix_86hsx13ssqid-2{list-style-type:none}.lst-kix_xv318blpjdo-3>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-3,lower-latin) ") "}ul.lst-kix_86hsx13ssqid-5{list-style-type:none}ul.lst-kix_86hsx13ssqid-4{list-style-type:none}.lst-kix_686a8e4qhxwx-1>li:before{content:"\0025cb "}ul.lst-kix_86hsx13ssqid-1{list-style-type:none}.lst-kix_jkgkf1u9sy0c-8>li:before{content:"\0025a0 "}ul.lst-kix_86hsx13ssqid-0{list-style-type:none}.lst-kix_686a8e4qhxwx-2>li:before{content:"\0025a0 "}ul.lst-kix_fy6y7gyjejoh-0{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-1{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-2{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-3{list-style-type:none}ul.lst-kix_86hsx13ssqid-7{list-style-type:none}ul.lst-kix_86hsx13ssqid-6{list-style-type:none}ul.lst-kix_86hsx13ssqid-8{list-style-type:none}.lst-kix_4m04az9jmmj8-8>li:before{content:"\0025a0 "}ul.lst-kix_fy6y7gyjejoh-8{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-4{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-5{list-style-type:none}.lst-kix_4m04az9jmmj8-7>li:before{content:"\0025cb "}ul.lst-kix_fy6y7gyjejoh-6{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-7{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-1.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-1 0}.lst-kix_q97rvvc7c69e-1>li:before{content:"\0025cb "}.lst-kix_q97rvvc7c69e-0>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-1>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-1,upper-latin) ". "}.lst-kix_4m04az9jmmj8-0>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-4>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-4,decimal) ") "}.lst-kix_emhp84jkv42c-0>li{counter-increment:lst-ctn-kix_emhp84jkv42c-0}.lst-kix_q8ok0mh9yyto-5>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-5,lower-latin) ") "}.lst-kix_q8ok0mh9yyto-5>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-5}.lst-kix_4m04az9jmmj8-4>li:before{content:"\0025cb "}.lst-kix_s3mi7ukxwiwf-1>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-1}.lst-kix_q8ok0mh9yyto-8>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-8,lower-roman) ") "}.lst-kix_4m04az9jmmj8-3>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-7>li{counter-increment:lst-ctn-kix_xv318blpjdo-7}ol.lst-kix_emhp84jkv42c-5.start{counter-reset:lst-ctn-kix_emhp84jkv42c-5 0}ol.lst-kix_xv318blpjdo-7.start{counter-reset:lst-ctn-kix_xv318blpjdo-7 0}.lst-kix_gfromclascha-1>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-7>li:before{content:"\0025cb "}.lst-kix_q8ok0mh9yyto-0>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-0}ol.lst-kix_q8ok0mh9yyto-3.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-3 0}.lst-kix_1wulu3ra2vwv-7>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-7}.lst-kix_6qnkx7t1adn9-6>li:before{content:"\0025cf "}.lst-kix_gfromclascha-5>li:before{content:"\0025a0 "}.lst-kix_fy6y7gyjejoh-0>li:before{content:"\0025cf "}ol.lst-kix_emhp84jkv42c-8.start{counter-reset:lst-ctn-kix_emhp84jkv42c-8 0}ol.lst-kix_q8ok0mh9yyto-6.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-6 0}.lst-kix_q97rvvc7c69e-4>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-5>li{counter-increment:lst-ctn-kix_xv318blpjdo-5}.lst-kix_5anu1k9tsyak-4>li:before{content:"\0025cb "}.lst-kix_s3mi7ukxwiwf-8>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-8}.lst-kix_s3mi7ukxwiwf-6>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-6,decimal) ". "}.lst-kix_fy6y7gyjejoh-8>li:before{content:"\0025a0 "}.lst-kix_1wulu3ra2vwv-5>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-5}.lst-kix_5anu1k9tsyak-0>li:before{content:"\0025cf "}.lst-kix_fy6y7gyjejoh-4>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-4.start{counter-reset:lst-ctn-kix_xv318blpjdo-4 0}.lst-kix_s3mi7ukxwiwf-2>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-2,lower-roman) ". "}.lst-kix_q97rvvc7c69e-8>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-4>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-4,decimal) ") "}.lst-kix_emhp84jkv42c-5>li{counter-increment:lst-ctn-kix_emhp84jkv42c-5}ol.lst-kix_xv318blpjdo-5.start{counter-reset:lst-ctn-kix_xv318blpjdo-5 0}.lst-kix_emhp84jkv42c-0>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-0,upper-roman) ". "}.lst-kix_emhp84jkv42c-8>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-8,lower-roman) ") "}.lst-kix_9jxnjym0nges-1>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-5.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-5 0}.lst-kix_1wulu3ra2vwv-5>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-5,lower-latin) ") "}.lst-kix_opi66v2qdsjs-1>li:before{content:"\0025cb "}.lst-kix_opi66v2qdsjs-5>li:before{content:"\0025a0 "}ol.lst-kix_emhp84jkv42c-7.start{counter-reset:lst-ctn-kix_emhp84jkv42c-7 0}ul.lst-kix_jkgkf1u9sy0c-4{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-5{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-6{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-7{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-8{list-style-type:none}ol.lst-kix_xv318blpjdo-6.start{counter-reset:lst-ctn-kix_xv318blpjdo-6 0}.lst-kix_1wulu3ra2vwv-0>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-0}ol.lst-kix_emhp84jkv42c-6.start{counter-reset:lst-ctn-kix_emhp84jkv42c-6 0}.lst-kix_9jxnjym0nges-5>li:before{content:"\0025a0 "}ul.lst-kix_6qnkx7t1adn9-8{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-4.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-4 0}ul.lst-kix_6qnkx7t1adn9-7{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-6{list-style-type:none}.lst-kix_86hsx13ssqid-3>li:before{content:"\0025cf "}ul.lst-kix_6qnkx7t1adn9-5{list-style-type:none}.lst-kix_sholqrhc62dh-3>li:before{content:"\0025cf "}ul.lst-kix_6qnkx7t1adn9-4{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-3{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-0{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-2{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-1{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-1{list-style-type:none}.lst-kix_1wulu3ra2vwv-1>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-1,upper-latin) ". "}ul.lst-kix_jkgkf1u9sy0c-2{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-0{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-3{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c7{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:468pt;border-top-color:#000000;border-bottom-style:solid}.c18{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:105.8pt;border-top-color:#000000;border-bottom-style:solid}.c6{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:92.2pt;border-top-color:#000000;border-bottom-style:solid}.c24{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:270pt;border-top-color:#000000;border-bottom-style:solid}.c33{color:#695d46;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:14pt;font-family:"PT Sans Narrow";font-style:normal}.c34{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c17{color:#666666;font-weight:400;text-decoration:underline;vertical-align:baseline;font-size:11pt;font-family:"Trebuchet MS";font-style:normal}.c2{color:#695d46;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Open Sans";font-style:normal}.c21{color:#ff5e0e;font-weight:700;text-decoration:none;vertical-align:baseline;font-size:18pt;font-family:"PT Sans Narrow";font-style:normal}.c16{color:#695d46;font-weight:700;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Open Sans";font-style:normal}.c32{color:#695d46;font-weight:700;text-decoration:none;vertical-align:baseline;font-size:42pt;font-family:"PT Sans Narrow";font-style:normal}.c4{padding-top:6pt;padding-bottom:0pt;line-height:1.2;orphans:2;widows:2;text-align:left}.c30{padding-top:8pt;padding-bottom:0pt;line-height:1.2;page-break-after:avoid;text-align:left}.c19{padding-top:24pt;padding-bottom:0pt;line-height:1.3;page-break-after:avoid;text-align:left}.c27{text-decoration:none;vertical-align:baseline;font-size:12pt;font-style:normal}.c20{padding-top:16pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c22{margin-left:36pt;border-spacing:0;border-collapse:collapse;margin-right:auto}.c1{padding-top:0pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c25{font-size:18pt;font-family:"PT Sans Narrow";color:#ff5e0e;font-weight:700}.c35{border-spacing:0;border-collapse:collapse;margin-right:auto}.c11{font-family:"Open Sans";color:#1155cc;font-weight:400;text-decoration:underline}.c0{margin-left:72pt;border-spacing:0;border-collapse:collapse;margin-right:auto}.c23{text-decoration:none;vertical-align:baseline;font-size:16pt;font-style:normal}.c28{padding-top:0pt;padding-bottom:0pt;line-height:1.2;text-align:left}.c14{font-family:"PT Sans Narrow";color:#008575;font-weight:400}.c9{font-family:"Open Sans";color:#695d46;font-weight:400}.c31{font-family:"Open Sans";color:#695d46;font-weight:700}.c29{orphans:2;widows:2}.c15{max-width:468pt;padding:72pt 72pt 72pt 72pt}.c10{margin-left:36pt;padding-left:0pt}.c13{padding:0;margin:0}.c3{color:inherit;text-decoration:inherit}.c12{margin-left:72pt;padding-left:0pt}.c5{background-color:#ffffff}.c8{height:0pt}.c26{height:11pt}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left} 

Oracle Fusion Middleware Deployments Using Docker Swarm Part I

Overview

This is the first in a series of blogs that describe how to build a Fusion Middleware (FMW) Cluster that runs as a number of Docker images that run in docker containers.  These containers are coordinated using Docker Swarm and can be deployed to a single host machine or multiple hosts.  This simplifies the task of building FMW clusters and also makes it easier to scale them in and out (adding or subtracting host machines) as well as up and down (using bigger or smaller host machines).

This blog uses Oracle Service Bus as an FMW product but the principles are applicable to other FMW products.

In this entry we will explain the concepts of using Docker Swarm 1.12 to create a Fusion Middleware Cluster.  We will explain how to set up a minimal Linux machine to run a docker engine and prepare it to start building out a Fusion Middleware Cluster running on Swarm.  In future entries we will cover creating a database docker image that we will use to support Fusion Middleware.  Other entries will explain how to create a docker image to run Fusion Middleware and create a cluster in swarm mode by defining swarm services for the database, WebLogic Admin Server and WebLogic managed servers.

Goals
  1. Create FMW Cluster 12.2 that runs on Docker Swarm 1.12
  2. User Swarm to support scaling in/out of the FMW cluster.
Introduction

FMW deployments can be complex to setup and configure.  The Enterprise Deployment Guide for SOA Suite 12.2.1 has a lots of steps to follow within its 382 pages.  This is taken care of for you when you subscribe to FMW on the cloud, such as Oracle SOA Cloud Service.  However many companies still run their FMW deployments in on premise systems and are not yet ready to move to the Oracle Cloud Machine, which provides a private cloud environment that looks just like the public cloud.

Docker provides a lightweight container in which to run software.  Multiple docker images can be coordinated by Docker Swarm to form a cluster.  Each image runs in a docker container which virtualizes the resources used by the image, making it possible for multiple images to execute on a single machines or for images to to be distributed across multiple machines.  In either case Swarm helps to manage the cluster of machines.

There are a number of blog entries that explain how to use FMW with docker but most of them only use the developer install, which can run in a single docker container.  A more normal FMW installation has a separate database and multiple managed servers.  There a few blog entries that describe using this, but they use old versions of docker and there are now better ways of implementing this.  We use the latest versions of docker and swarm to show to create FMW clusters running on docker swarm in a configuration that is production ready.

Over this and the next few blog entries I have partnered with my colleague Shuxuan Nie to describe how to run a highly FMW deployment on top of Docker.  We have used Oracle Service Bus as an example FMW deployment but the principles can be applied to any FMW deployment.

AuthorsShuxuan ‘Judy’ Nie029.JPG

Holding a masters degree in computer science from Beijing University of Aeronautics and Astronautics Shuxuan Nie is a senior principal devops engineer working on Oracle's forthcoming Adaptive Intelligence Applications Cloud Service (AIA).  Prior to joining Oracle, Shuxuan worked as a systems architect at Australian based Oracle partner Rubicon Red.  There she specialized in helping customers build highly available FMW environments on both physical hardware and VMs.  She also contributed to Rubicon Reds Myst platform provisioning and continuous delivery tool.  In her current position she works with Oracle Container Cloud Service (which provides docker in the cloud) to provide deployment environments for the AIA cloud service.

Antony ReynoldsIMG_7082.JPG

A graduate of Bristol University Antony Reynolds is a Product Strategy Director in Oracle’sIntegration Products group where he works with Oracle Integration Cloud Service (ICS).  In addition to working with ICS he also helps customers upgrade to the latest SOA Suite releases, working closely with some of the largest users of SOA Suite in the world.  A blogger and author of several books on Oracle SOA Suite Antony was attracted to Docker by its lightweight container model and power of abstraction.

Architecture

FMW and WebLogic rely on a database and an Admin Server.  This leads us to require the following Docker containers to implement FMW on Docker.  Each docker container runs a docker image.  The beauty of Docker is that these containers can be deployed together on a single machine or distributed across multiple machines without any changes to their configuration.

Docker Containers for FMW Cluster

We could deploy all the containers on a single machine as shown below.


Docker Containers Running FMW on a Single Powerful Machine

Alternatively we can distribute them across several machines.

Docker Containers Running FMW on Multiple Machines

Of course we could choose a combination of the two.


Docker Containers Running FMW on Multiple Machines, some Running Multiple Containers

Note that from the docker containers perspective each thinks it is running in its own physical machine, although it is actually running in a docker container on a physical or virtual machines and may be sharing that machine with other running docker containers.

Initially we deployed all the containers on a single machine, once we had that working then we deployed our contains to multiple machines.

Docker & Swarm for FMW People

We are used to running FMW on multiple virtual machines.  This is used extensively on Oracle Exalogic for example, as well as the large number of customers who run FMW on Oracle Virtual Machine (OVM) or Dell’s VMWare.  The problem with VMs is that each virtual machine has a whole operating system that is running on top of the VM hypervisor.  This includes the kernel and file system which makes a VM a relatively heavyweight container.

In contrast to a Virtual Machine a Docker Container just abstracts the CPU, memory, network and file system of the underlying operating system.  It does not run a separate kernel, instead deferring most of the execution to the underlying machine,m physical or virtual.  This results in a lighter weight container that still has the benefits of isolation and abstraction that a VM provides.  This is why people are excited about using docker containers to host services, particularly micro services, that would be too expensive to dedicate a VM to.

A docker image is a specific set of binaries and configuration that is targeted to run inside a docker container.  This could be an Oracle database, a WebLogic managed server or a WebLogic admin server.

So let's translate FMW / WebLogic deployment terms onto docker concepts.  Note that this is a conceptual mapping, but is not an exact equivalent.

FMW ConceptDocker ConceptNotes

Machine

Docker Engine

Docker engine can run multiple docker containers on a single host.

Cluster

Swarm Cluster

Docker swarm clusters can be used to run multiple instances of an image, providing a great platform to run an FMW cluster on top of.

Node Manager

Swarm Manager

Manages the swarm cluster and decides on which docker engine to run a particular container.  Note that this function is split between Weblogic Console and Node Manager in WebLogic.

Binaries and Domain Configuration

Docker Image

A docker image represents a set of code and associated configuration packaged up for execution in a docker container.

Server instance

Docker Container

A running image instance, parameters can be used to customize the instance, so that the same image can be used to run an Admin server or a Managed Server.

Managed WebLogic Server in a Cluster

Swarm Service

A swarm service is a generic service.  A WebLogic Admin Server would be a Swarm Service with a single instance.  A Managed Server would be a Swarm Service that allowed multiple instances.

Note that although FMW allows multiple servers to be targeted at a single machine, docker achieves this through two level, a docker container runs a single server, but a docker engine can run multiple containers..  This is not as limiting as it sounds because a docker container is much lighter than a VM and so it is easy to run multiple docker containers on a docker engine running on a single VM or physical machine with minimal overhead on top of the requirements of the WebLogic server.

FMW for Docker People

Oracle Fusion Middleware is the name for Oracle’s middleware products.  These are powerful proprietary middleware products that are used by customers throughout the world to; run applications and portals, integrate systems, provide business analytics and secure their environments, amongst other things.

Although many of these products are available in free developer editions they still require acknowledgement of the Oracle license and as such cannot be distributed as part of a docker image.  These products can also be large, often requiring several gigabytes of download before being installed.  These factors when combined have led Oracle and others to provide dockerfiles to create docker images that install and configure Oracle products into provided base images.  The software to be installed must be provided separately from the dockerfiles.  The created docker images can then stored in a company specific docker repository.  These docker images can then be used in the same way as any other docker image.  This is the approach that will be followed in this document.

Base VM Image

We built on a headless and minimum rpm installed Oracle Linux 7 VM that has a download footprint of only 1GB.  The instructions provided are applicable to other OL 7 and RHEL 7 environments.  With minimal changes the same instructions should also apply to other Linux releases such as Ubuntu.  The image is configured and set up with a docker environment.

The VM is used as our base platform to run docker.

Downloading VM

Because of licensing restrictions we are unable to provide a VM for download.  However if you are an Oracle employee then please contact us and we will point you at a downloadable image.

Image Pre-Requisites

If you don’t use the provided image then the following is needed of an OL 7 image.

  • As root run yum util to enable UEKR4 and addons in yum repo

yum -y install yum-utils

yum-config-manager --enable ol7_addons

yum-config-manager --enable ol7_UEKR4

yum-config-manager --disable ol7_UEKR3_latest

  • Install 4.x kernel and reboot the system, selecting the UEK R4 kernel if this is not the default boot kernel

yum update

systemctl reboot

  • Install minimum required packages

yum install wget unzip net-tools

  • Provide btrfs file system as storage driver used by docker instead of default device mapper.  We will refer to the root of the btrfs file system as /var/lib/docker
  • Use yum to install btrfs-progs package

root@docker-base ~]# yum install btrfs-progs

  • Create btrfs file system on the device, such as /dev/sdb in this example.

root@docker-base ~]# mkfs.btrfs /dev/sdb

  • Display UUID of the device via blkid command

[root@docker-base ~]# blkid /dev/sdb

/dev/sdb: UUID="fe6bf7a2-34fc-4800-af2b-da19d2d8db6d" UUID_SUB="e955087d-80b5-4051-bb28-ed71edb9cea4" TYPE="btrfs"

  • Create the config file /etc/systemd/system/var-lib-docker.mount with below content, replace your UUID value:

[Unit]

Description = Docker Image Store

[Mount]

What = UUID=<Your UUID Value>

Where = /var/lib/docker

Type = btrfs

[Install]

WantedBy = multi-user.target

  • The above file defines systemd users to mount the file system on /var/lib/docker, need to create this folder if this is the fresh installation

[root@docker-base ~]# mkdir /var/lib/docker

  • Enable var-lib-docker.mount target and mount the file system

[root@docker-base ~]# systemctl enable var-lib-docker.mount

[root@docker-base ~]# systemctl start var-lib-docker.mount

  • Create the  /etc/systemd/system/docker.service.d/var-lib-docker-mount.conf to tell systemd to mount the /var/lib/docker file system by using the var-lib-docker.mount target before starting the docker service

[Unit]

Requires=var-lib-docker.mount

After=var-lib-docker.mount

  • Set the SELinux mode to permissive or disable SELinux. In this demo, we disable SELinux in /etc/selinux/config.  We do this to avoid having to configure selinux policies to run docker.  Your Linux security team may require you to set up an appropriate policy.

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#     enforcing - SELinux security policy is enforced.

#     permissive - SELinux prints warnings instead of enforcing.

#     disabled - No SELinux policy is loaded.

SELINUX=disabled

# SELINUXTYPE= can take one of three two values:

#     targeted - Targeted processes are protected,

#     minimum - Modification of targeted policy. Only selected processes are protected.

#     mls - Multi Level Security protection.

SELINUXTYPE=targeted

                The above change requires to reboot the system

[root@docker-base ~]# systemctl reboot

  • Install docker engine, in our demo we install latest version 1.12

[root@docker-base ~]# yum install docker-engine

  • Start docker service and set to auto start

[root@docker-base ~]# systemctl start docker

[root@docker-base ~]# systemctl enable docker

  • Check docker running status

[root@docker-base ~]# systemctl status docker

● docker.service - Docker Application Container Engine

   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)

  Drop-In: /etc/systemd/system/docker.service.d

           └─docker-network.conf, docker-sysconfig.conf, http-proxy.conf, var-lib-docker-mount.conf

   Active: active (running) since Sun 2017-01-08 12:16:38 PST; 52min ago

     Docs: https://docs.docker.com

 Main PID: 871 (dockerd)

   Memory: 64.7M

   CGroup: /system.slice/docker.service

           ├─ 871 dockerd --selinux-enabled

           └─1020 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0...

  • Display docker information, you can verify the version and btrfs storage driver

[root@docker-base ~]# docker info

Containers: 0

 Running: 0

 Paused: 0

 Stopped: 0

Images: 0

Server Version: 1.12.2

Storage Driver: btrfs

 Build Version: Btrfs v3.19.1

 Library Version: 101

Logging Driver: json-file

Cgroup Driver: cgroupfs

Plugins:

 Volume: local

 Network: null host bridge overlay

Swarm: inactive

Runtimes: runc

Default Runtime: runc

Security Options: seccomp

Kernel Version: 4.1.12-61.1.24.el7uek.x86_64

Operating System: Oracle Linux Server 7.3

OSType: linux

Architecture: x86_64

CPUs: 1

Total Memory: 4.133 GiB

Name: docker-base.us.oracle.com

ID: ELNP:SGZ6:MUMH:FWOC:3BZ2:NZOA:KBKQ:3RT2:ADS4:AX5T:M5YT:RLXR

Docker Root Dir: /var/lib/docker

Debug Mode (client): false

Debug Mode (server): false

Registry: https://index.docker.io/v1/

Insecure Registries:

 127.0.0.0/8

  • Create oracle user
  • useradd oracle
  • Add oracle user to docker group
  • usermod -a -G docker oracle
Summary

In this entry we have introduced the concept of using Docker Swarm 1.12 to create a Fusion Middleware Cluster.  We have explained how to set up a minimal Linux machine to run a docker engine and prepared it to start building out a Fusion Middleware Cluster running on Swarm.  In our next entry we will cover creating a database docker image that we will use in later entries to support Fusion Middleware.  Later entries will explain how to install Fusion Middleware and create a cluster in swarm mode by defining swarm services for the database, WebLogic Admin Server and WebLogic managed servers.

Building an FMW Cluster using Docker (Part I Introduction)

Sat, 2017-01-14 21:19
@import url('https://themes.googleusercontent.com/fonts/css?kit=iMc4-4exjgqA-toZgqqJBapXv4aEsWUJfLHj8vTDOv6sKTypj6oMABt6aLc3fm-oS8WuZCZU7xsrLLn8Eq5Dllll7szA_gjBFRwwth-OR18');.lst-kix_sholqrhc62dh-7>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-8>li:before{content:"\0025a0 "}.lst-kix_sholqrhc62dh-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-3.start{counter-reset:lst-ctn-kix_xv318blpjdo-3 0}ul.lst-kix_bijol4nzhwf0-8{list-style-type:none}.lst-kix_sholqrhc62dh-1>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-0>li:before{content:"\0025cf "}ol.lst-kix_emhp84jkv42c-0{list-style-type:none}.lst-kix_emhp84jkv42c-3>li{counter-increment:lst-ctn-kix_emhp84jkv42c-3}ol.lst-kix_emhp84jkv42c-2{list-style-type:none}ol.lst-kix_emhp84jkv42c-1{list-style-type:none}ol.lst-kix_emhp84jkv42c-4{list-style-type:none}ol.lst-kix_emhp84jkv42c-3{list-style-type:none}ol.lst-kix_emhp84jkv42c-6{list-style-type:none}ol.lst-kix_emhp84jkv42c-5{list-style-type:none}ol.lst-kix_emhp84jkv42c-8{list-style-type:none}ol.lst-kix_emhp84jkv42c-7{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-0{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-1{list-style-type:none}ul.lst-kix_4m04az9jmmj8-3{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-2{list-style-type:none}ul.lst-kix_4m04az9jmmj8-2{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-3{list-style-type:none}ul.lst-kix_4m04az9jmmj8-1{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-4{list-style-type:none}ul.lst-kix_4m04az9jmmj8-0{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-5{list-style-type:none}ul.lst-kix_4m04az9jmmj8-7{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-6{list-style-type:none}ul.lst-kix_4m04az9jmmj8-6{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-7{list-style-type:none}ul.lst-kix_4m04az9jmmj8-5{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-8{list-style-type:none}ul.lst-kix_4m04az9jmmj8-4{list-style-type:none}ul.lst-kix_4m04az9jmmj8-8{list-style-type:none}ul.lst-kix_bijol4nzhwf0-4{list-style-type:none}.lst-kix_s3mi7ukxwiwf-2>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-2}ul.lst-kix_bijol4nzhwf0-5{list-style-type:none}ul.lst-kix_bijol4nzhwf0-6{list-style-type:none}ul.lst-kix_bijol4nzhwf0-7{list-style-type:none}ul.lst-kix_bijol4nzhwf0-0{list-style-type:none}ul.lst-kix_bijol4nzhwf0-1{list-style-type:none}ul.lst-kix_bijol4nzhwf0-2{list-style-type:none}ul.lst-kix_bijol4nzhwf0-3{list-style-type:none}.lst-kix_1wulu3ra2vwv-2>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-2}.lst-kix_q8ok0mh9yyto-4>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-4}.lst-kix_bijol4nzhwf0-7>li:before{content:"\0025cb "}.lst-kix_bijol4nzhwf0-6>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-8>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-5>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-3>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-2>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-4>li:before{content:"\0025cb "}ol.lst-kix_emhp84jkv42c-4.start{counter-reset:lst-ctn-kix_emhp84jkv42c-4 0}ol.lst-kix_xv318blpjdo-8.start{counter-reset:lst-ctn-kix_xv318blpjdo-8 0}.lst-kix_q8ok0mh9yyto-8>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-8}ol.lst-kix_q8ok0mh9yyto-1.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-1 0}ol.lst-kix_s3mi7ukxwiwf-8.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-8 0}ol.lst-kix_s3mi7ukxwiwf-1.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-1 0}.lst-kix_bijol4nzhwf0-0>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-1>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-1>li{counter-increment:lst-ctn-kix_xv318blpjdo-1}ul.lst-kix_gfromclascha-0{list-style-type:none}ol.lst-kix_emhp84jkv42c-2.start{counter-reset:lst-ctn-kix_emhp84jkv42c-2 0}.lst-kix_s3mi7ukxwiwf-1>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-1,lower-latin) ". "}.lst-kix_gfromclascha-0>li:before{content:"\0025cf "}.lst-kix_gfromclascha-2>li:before{content:"\0025a0 "}.lst-kix_gfromclascha-4>li:before{content:"\0025cb "}ul.lst-kix_gfromclascha-7{list-style-type:none}ul.lst-kix_gfromclascha-8{list-style-type:none}ul.lst-kix_gfromclascha-5{list-style-type:none}.lst-kix_gfromclascha-6>li:before{content:"\0025cf "}ul.lst-kix_gfromclascha-6{list-style-type:none}ul.lst-kix_gfromclascha-3{list-style-type:none}ul.lst-kix_gfromclascha-4{list-style-type:none}ul.lst-kix_gfromclascha-1{list-style-type:none}ul.lst-kix_gfromclascha-2{list-style-type:none}ul.lst-kix_opi66v2qdsjs-3{list-style-type:none}ul.lst-kix_opi66v2qdsjs-2{list-style-type:none}ul.lst-kix_opi66v2qdsjs-1{list-style-type:none}ul.lst-kix_opi66v2qdsjs-0{list-style-type:none}.lst-kix_q97rvvc7c69e-5>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-7>li:before{content:"\0025cb "}.lst-kix_q8ok0mh9yyto-0>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-0,upper-roman) ". "}ol.lst-kix_q8ok0mh9yyto-8.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-8 0}.lst-kix_fy6y7gyjejoh-3>li:before{content:"\0025cf "}ul.lst-kix_opi66v2qdsjs-8{list-style-type:none}.lst-kix_q97rvvc7c69e-3>li:before{content:"\0025cf "}ul.lst-kix_opi66v2qdsjs-7{list-style-type:none}ul.lst-kix_opi66v2qdsjs-6{list-style-type:none}ul.lst-kix_opi66v2qdsjs-5{list-style-type:none}.lst-kix_fy6y7gyjejoh-1>li:before{content:"\0025cb "}ul.lst-kix_opi66v2qdsjs-4{list-style-type:none}.lst-kix_s3mi7ukxwiwf-7>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-7,lower-latin) ". "}.lst-kix_xv318blpjdo-8>li{counter-increment:lst-ctn-kix_xv318blpjdo-8}.lst-kix_emhp84jkv42c-7>li{counter-increment:lst-ctn-kix_emhp84jkv42c-7}.lst-kix_s3mi7ukxwiwf-5>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-5,lower-roman) ". "}.lst-kix_fy6y7gyjejoh-7>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-1.start{counter-reset:lst-ctn-kix_xv318blpjdo-1 0}.lst-kix_fy6y7gyjejoh-5>li:before{content:"\0025a0 "}.lst-kix_s3mi7ukxwiwf-3>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-3,decimal) ". "}.lst-kix_emhp84jkv42c-3>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-3,lower-latin) ") "}.lst-kix_emhp84jkv42c-5>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-5,lower-latin) ") "}.lst-kix_emhp84jkv42c-1>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-1,upper-latin) ". "}.lst-kix_emhp84jkv42c-7>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-7,lower-latin) ") "}.lst-kix_1wulu3ra2vwv-4>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-4,decimal) ") "}.lst-kix_1wulu3ra2vwv-6>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-6,lower-roman) ") "}.lst-kix_s3mi7ukxwiwf-6>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-6}.lst-kix_1wulu3ra2vwv-8>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-8,lower-roman) ") "}ol.lst-kix_1wulu3ra2vwv-4.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-4 0}.lst-kix_gfromclascha-8>li:before{content:"\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-1{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-2{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-0{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-1{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-5{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-2{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-6{list-style-type:none}.lst-kix_sholqrhc62dh-2>li:before{content:"\0025a0 "}ul.lst-kix_9jxnjym0nges-0{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-3{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-0{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-4{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-5{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-6{list-style-type:none}.lst-kix_sholqrhc62dh-4>li:before{content:"\0025cb "}.lst-kix_1wulu3ra2vwv-2>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-2,decimal) ". "}ul.lst-kix_7tib3jrzu2u9-3{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-7{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-4{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-8{list-style-type:none}.lst-kix_1wulu3ra2vwv-0>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-0,upper-roman) ". "}ul.lst-kix_7tib3jrzu2u9-7{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-8{list-style-type:none}.lst-kix_emhp84jkv42c-2>li{counter-increment:lst-ctn-kix_emhp84jkv42c-2}ol.lst-kix_s3mi7ukxwiwf-4.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-4 0}.lst-kix_xv318blpjdo-1>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-1,upper-latin) ". "}.lst-kix_xv318blpjdo-0>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-0,upper-roman) ". "}ol.lst-kix_1wulu3ra2vwv-7.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-7 0}.lst-kix_1wulu3ra2vwv-1>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-1}.lst-kix_jkgkf1u9sy0c-2>li:before{content:"\0025a0 "}.lst-kix_jkgkf1u9sy0c-1>li:before{content:"\0025cb "}.lst-kix_opi66v2qdsjs-0>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-7>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-8>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-8,lower-roman) ") "}.lst-kix_xv318blpjdo-5>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-5,lower-latin) ") "}.lst-kix_jkgkf1u9sy0c-5>li:before{content:"\0025a0 "}.lst-kix_686a8e4qhxwx-3>li:before{content:"\0025cf "}.lst-kix_jkgkf1u9sy0c-6>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-4>li:before{content:"\0025cb "}.lst-kix_emhp84jkv42c-4>li{counter-increment:lst-ctn-kix_emhp84jkv42c-4}.lst-kix_xv318blpjdo-4>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-4,decimal) ") "}.lst-kix_s3mi7ukxwiwf-7>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-7}.lst-kix_q97rvvc7c69e-2>li:before{content:"\0025a0 "}.lst-kix_q8ok0mh9yyto-3>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-3,lower-latin) ") "}.lst-kix_686a8e4qhxwx-8>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-6>li{counter-increment:lst-ctn-kix_emhp84jkv42c-6}.lst-kix_q8ok0mh9yyto-2>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-2,decimal) ". "}ol.lst-kix_1wulu3ra2vwv-6.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-6 0}.lst-kix_q8ok0mh9yyto-6>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-6,lower-roman) ") "}.lst-kix_4m04az9jmmj8-2>li:before{content:"\0025a0 "}.lst-kix_4m04az9jmmj8-6>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-7>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-7,lower-latin) ") "}.lst-kix_4m04az9jmmj8-1>li:before{content:"\0025cb "}.lst-kix_4m04az9jmmj8-5>li:before{content:"\0025a0 "}.lst-kix_xv318blpjdo-4>li{counter-increment:lst-ctn-kix_xv318blpjdo-4}.lst-kix_s3mi7ukxwiwf-0>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-0,decimal) ". "}ul.lst-kix_q97rvvc7c69e-4{list-style-type:none}ul.lst-kix_q97rvvc7c69e-3{list-style-type:none}ul.lst-kix_q97rvvc7c69e-6{list-style-type:none}.lst-kix_s3mi7ukxwiwf-8>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-8,lower-roman) ". "}ul.lst-kix_q97rvvc7c69e-5{list-style-type:none}ul.lst-kix_q97rvvc7c69e-8{list-style-type:none}ul.lst-kix_q97rvvc7c69e-7{list-style-type:none}.lst-kix_6qnkx7t1adn9-4>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-8>li:before{content:"\0025a0 "}.lst-kix_gfromclascha-3>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-6>li{counter-increment:lst-ctn-kix_xv318blpjdo-6}ul.lst-kix_q97rvvc7c69e-0{list-style-type:none}ul.lst-kix_q97rvvc7c69e-2{list-style-type:none}ul.lst-kix_q97rvvc7c69e-1{list-style-type:none}.lst-kix_q97rvvc7c69e-6>li:before{content:"\0025cf "}ol.lst-kix_s3mi7ukxwiwf-3.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-3 0}.lst-kix_fy6y7gyjejoh-2>li:before{content:"\0025a0 "}.lst-kix_fy6y7gyjejoh-6>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-1>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-1}ol.lst-kix_1wulu3ra2vwv-8.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-8 0}.lst-kix_s3mi7ukxwiwf-4>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-4,lower-latin) ". "}.lst-kix_5anu1k9tsyak-2>li:before{content:"\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-6.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-6 0}.lst-kix_emhp84jkv42c-2>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-2,decimal) ". "}.lst-kix_emhp84jkv42c-6>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-6,lower-roman) ") "}.lst-kix_686a8e4qhxwx-0>li:before{content:"\0025cf "}.lst-kix_1wulu3ra2vwv-3>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-3,lower-latin) ") "}.lst-kix_9jxnjym0nges-3>li:before{content:"\0025cf "}.lst-kix_opi66v2qdsjs-7>li:before{content:"\0025cb "}.lst-kix_1wulu3ra2vwv-7>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-7,lower-latin) ") "}ol.lst-kix_s3mi7ukxwiwf-5.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-5 0}.lst-kix_opi66v2qdsjs-3>li:before{content:"\0025cf "}.lst-kix_1wulu3ra2vwv-6>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-6}.lst-kix_gfromclascha-7>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-5>li:before{content:"\0025a0 "}.lst-kix_9jxnjym0nges-7>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-1>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-5>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-0>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-4>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-4}.lst-kix_7tib3jrzu2u9-4>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-4{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-7.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-7 0}ol.lst-kix_xv318blpjdo-5{list-style-type:none}ol.lst-kix_xv318blpjdo-6{list-style-type:none}ol.lst-kix_xv318blpjdo-7{list-style-type:none}ol.lst-kix_xv318blpjdo-0{list-style-type:none}ol.lst-kix_xv318blpjdo-1{list-style-type:none}.lst-kix_7tib3jrzu2u9-1>li:before{content:"\0025cb "}.lst-kix_7tib3jrzu2u9-5>li:before{content:"\0025a0 "}ol.lst-kix_xv318blpjdo-2{list-style-type:none}ol.lst-kix_xv318blpjdo-3{list-style-type:none}.lst-kix_q8ok0mh9yyto-6>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-6}.lst-kix_7tib3jrzu2u9-2>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-3>li:before{content:"\0025cf "}ul.lst-kix_5anu1k9tsyak-7{list-style-type:none}ul.lst-kix_5anu1k9tsyak-8{list-style-type:none}ul.lst-kix_5anu1k9tsyak-5{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-0{list-style-type:none}ul.lst-kix_5anu1k9tsyak-6{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-1{list-style-type:none}ul.lst-kix_5anu1k9tsyak-3{list-style-type:none}ul.lst-kix_5anu1k9tsyak-4{list-style-type:none}ul.lst-kix_5anu1k9tsyak-1{list-style-type:none}.lst-kix_xv318blpjdo-3>li{counter-increment:lst-ctn-kix_xv318blpjdo-3}ul.lst-kix_5anu1k9tsyak-2{list-style-type:none}.lst-kix_7tib3jrzu2u9-8>li:before{content:"\0025a0 "}ul.lst-kix_sholqrhc62dh-6{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-6{list-style-type:none}ul.lst-kix_5anu1k9tsyak-0{list-style-type:none}ul.lst-kix_sholqrhc62dh-5{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-7{list-style-type:none}ul.lst-kix_sholqrhc62dh-4{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-8{list-style-type:none}ul.lst-kix_sholqrhc62dh-3{list-style-type:none}.lst-kix_7tib3jrzu2u9-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-8{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-2{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-3{list-style-type:none}.lst-kix_7tib3jrzu2u9-7>li:before{content:"\0025cb "}ul.lst-kix_sholqrhc62dh-8{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-4{list-style-type:none}ul.lst-kix_sholqrhc62dh-7{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-5{list-style-type:none}ul.lst-kix_sholqrhc62dh-2{list-style-type:none}ul.lst-kix_sholqrhc62dh-1{list-style-type:none}ul.lst-kix_sholqrhc62dh-0{list-style-type:none}.lst-kix_emhp84jkv42c-1>li{counter-increment:lst-ctn-kix_emhp84jkv42c-1}ol.lst-kix_1wulu3ra2vwv-5.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-5 0}.lst-kix_j42a5dwgnqyq-8>li:before{content:"\0025a0 "}ol.lst-kix_q8ok0mh9yyto-2.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-2 0}.lst-kix_5anu1k9tsyak-7>li:before{content:"\0025cb "}.lst-kix_j42a5dwgnqyq-6>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-6>li:before{content:"\0025cf "}.lst-kix_j42a5dwgnqyq-7>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-2.start{counter-reset:lst-ctn-kix_xv318blpjdo-2 0}.lst-kix_1wulu3ra2vwv-4>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-4}.lst-kix_5anu1k9tsyak-8>li:before{content:"\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-2.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-2 0}ul.lst-kix_686a8e4qhxwx-4{list-style-type:none}ul.lst-kix_686a8e4qhxwx-3{list-style-type:none}ul.lst-kix_686a8e4qhxwx-2{list-style-type:none}.lst-kix_q8ok0mh9yyto-2>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-2}ul.lst-kix_686a8e4qhxwx-1{list-style-type:none}ul.lst-kix_686a8e4qhxwx-8{list-style-type:none}ul.lst-kix_686a8e4qhxwx-7{list-style-type:none}ul.lst-kix_686a8e4qhxwx-6{list-style-type:none}.lst-kix_6qnkx7t1adn9-0>li:before{content:"\0025cf "}ul.lst-kix_686a8e4qhxwx-5{list-style-type:none}.lst-kix_6qnkx7t1adn9-1>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-3>li:before{content:"\0025cf "}ul.lst-kix_686a8e4qhxwx-0{list-style-type:none}.lst-kix_6qnkx7t1adn9-2>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-0>li:before{content:"\0025cf "}.lst-kix_j42a5dwgnqyq-2>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-1>li:before{content:"\0025cb "}.lst-kix_j42a5dwgnqyq-5>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-4>li:before{content:"\0025cb "}ol.lst-kix_1wulu3ra2vwv-0.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-0 0}ol.lst-kix_q8ok0mh9yyto-7.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-7 0}ol.lst-kix_emhp84jkv42c-3.start{counter-reset:lst-ctn-kix_emhp84jkv42c-3 0}.lst-kix_j42a5dwgnqyq-3>li:before{content:"\0025cf "}.lst-kix_emhp84jkv42c-8>li{counter-increment:lst-ctn-kix_emhp84jkv42c-8}ol.lst-kix_1wulu3ra2vwv-3.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-3 0}ol.lst-kix_q8ok0mh9yyto-0.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-0 0}.lst-kix_6qnkx7t1adn9-5>li:before{content:"\0025a0 "}.lst-kix_6qnkx7t1adn9-7>li:before{content:"\0025cb "}ol.lst-kix_s3mi7ukxwiwf-0.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-0 0}.lst-kix_86hsx13ssqid-8>li:before{content:"\0025a0 "}.lst-kix_s3mi7ukxwiwf-0>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-0}.lst-kix_5anu1k9tsyak-3>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-5>li:before{content:"\0025a0 "}.lst-kix_1wulu3ra2vwv-8>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-8}.lst-kix_5anu1k9tsyak-1>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-6{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-5{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-4{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-3{list-style-type:none}.lst-kix_9jxnjym0nges-0>li:before{content:"\0025cf "}ol.lst-kix_q8ok0mh9yyto-8{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-7{list-style-type:none}ol.lst-kix_emhp84jkv42c-0.start{counter-reset:lst-ctn-kix_emhp84jkv42c-0 0}.lst-kix_opi66v2qdsjs-8>li:before{content:"\0025a0 "}ol.lst-kix_q8ok0mh9yyto-2{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-1{list-style-type:none}.lst-kix_9jxnjym0nges-2>li:before{content:"\0025a0 "}ol.lst-kix_q8ok0mh9yyto-0{list-style-type:none}.lst-kix_opi66v2qdsjs-4>li:before{content:"\0025cb "}.lst-kix_opi66v2qdsjs-2>li:before{content:"\0025a0 "}.lst-kix_opi66v2qdsjs-6>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-3>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-3}.lst-kix_1wulu3ra2vwv-3>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-3}.lst-kix_86hsx13ssqid-0>li:before{content:"\0025cf "}.lst-kix_86hsx13ssqid-6>li:before{content:"\0025cf "}.lst-kix_9jxnjym0nges-4>li:before{content:"\0025cb "}.lst-kix_9jxnjym0nges-8>li:before{content:"\0025a0 "}.lst-kix_86hsx13ssqid-4>li:before{content:"\0025cb "}.lst-kix_9jxnjym0nges-6>li:before{content:"\0025cf "}.lst-kix_86hsx13ssqid-2>li:before{content:"\0025a0 "}ul.lst-kix_9jxnjym0nges-2{list-style-type:none}.lst-kix_xv318blpjdo-2>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-2,decimal) ". "}ul.lst-kix_9jxnjym0nges-1{list-style-type:none}ul.lst-kix_9jxnjym0nges-4{list-style-type:none}ul.lst-kix_9jxnjym0nges-3{list-style-type:none}ul.lst-kix_9jxnjym0nges-6{list-style-type:none}ul.lst-kix_9jxnjym0nges-5{list-style-type:none}ul.lst-kix_9jxnjym0nges-8{list-style-type:none}ul.lst-kix_9jxnjym0nges-7{list-style-type:none}.lst-kix_xv318blpjdo-2>li{counter-increment:lst-ctn-kix_xv318blpjdo-2}.lst-kix_s3mi7ukxwiwf-3>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-3}ol.lst-kix_xv318blpjdo-0.start{counter-reset:lst-ctn-kix_xv318blpjdo-0 0}.lst-kix_jkgkf1u9sy0c-0>li:before{content:"\0025cf "}.lst-kix_jkgkf1u9sy0c-3>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-0>li{counter-increment:lst-ctn-kix_xv318blpjdo-0}ol.lst-kix_emhp84jkv42c-1.start{counter-reset:lst-ctn-kix_emhp84jkv42c-1 0}.lst-kix_jkgkf1u9sy0c-4>li:before{content:"\0025cb "}ol.lst-kix_1wulu3ra2vwv-2.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-2 0}.lst-kix_686a8e4qhxwx-6>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-5>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-5}.lst-kix_jkgkf1u9sy0c-7>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-7>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-7,lower-latin) ") "}.lst-kix_686a8e4qhxwx-5>li:before{content:"\0025a0 "}.lst-kix_xv318blpjdo-6>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-6,lower-roman) ") "}.lst-kix_q8ok0mh9yyto-7>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-7}ul.lst-kix_86hsx13ssqid-3{list-style-type:none}ul.lst-kix_86hsx13ssqid-2{list-style-type:none}.lst-kix_xv318blpjdo-3>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-3,lower-latin) ") "}ul.lst-kix_86hsx13ssqid-5{list-style-type:none}ul.lst-kix_86hsx13ssqid-4{list-style-type:none}.lst-kix_686a8e4qhxwx-1>li:before{content:"\0025cb "}ul.lst-kix_86hsx13ssqid-1{list-style-type:none}.lst-kix_jkgkf1u9sy0c-8>li:before{content:"\0025a0 "}ul.lst-kix_86hsx13ssqid-0{list-style-type:none}.lst-kix_686a8e4qhxwx-2>li:before{content:"\0025a0 "}ul.lst-kix_fy6y7gyjejoh-0{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-1{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-2{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-3{list-style-type:none}ul.lst-kix_86hsx13ssqid-7{list-style-type:none}ul.lst-kix_86hsx13ssqid-6{list-style-type:none}ul.lst-kix_86hsx13ssqid-8{list-style-type:none}.lst-kix_4m04az9jmmj8-8>li:before{content:"\0025a0 "}ul.lst-kix_fy6y7gyjejoh-8{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-4{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-5{list-style-type:none}.lst-kix_4m04az9jmmj8-7>li:before{content:"\0025cb "}ul.lst-kix_fy6y7gyjejoh-6{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-7{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-1.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-1 0}.lst-kix_q97rvvc7c69e-1>li:before{content:"\0025cb "}.lst-kix_q97rvvc7c69e-0>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-1>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-1,upper-latin) ". "}.lst-kix_4m04az9jmmj8-0>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-4>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-4,decimal) ") "}.lst-kix_emhp84jkv42c-0>li{counter-increment:lst-ctn-kix_emhp84jkv42c-0}.lst-kix_q8ok0mh9yyto-5>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-5,lower-latin) ") "}.lst-kix_q8ok0mh9yyto-5>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-5}.lst-kix_4m04az9jmmj8-4>li:before{content:"\0025cb "}.lst-kix_s3mi7ukxwiwf-1>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-1}.lst-kix_q8ok0mh9yyto-8>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-8,lower-roman) ") "}.lst-kix_4m04az9jmmj8-3>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-7>li{counter-increment:lst-ctn-kix_xv318blpjdo-7}ol.lst-kix_emhp84jkv42c-5.start{counter-reset:lst-ctn-kix_emhp84jkv42c-5 0}ol.lst-kix_xv318blpjdo-7.start{counter-reset:lst-ctn-kix_xv318blpjdo-7 0}.lst-kix_gfromclascha-1>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-7>li:before{content:"\0025cb "}.lst-kix_q8ok0mh9yyto-0>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-0}ol.lst-kix_q8ok0mh9yyto-3.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-3 0}.lst-kix_1wulu3ra2vwv-7>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-7}.lst-kix_6qnkx7t1adn9-6>li:before{content:"\0025cf "}.lst-kix_gfromclascha-5>li:before{content:"\0025a0 "}.lst-kix_fy6y7gyjejoh-0>li:before{content:"\0025cf "}ol.lst-kix_emhp84jkv42c-8.start{counter-reset:lst-ctn-kix_emhp84jkv42c-8 0}ol.lst-kix_q8ok0mh9yyto-6.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-6 0}.lst-kix_q97rvvc7c69e-4>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-5>li{counter-increment:lst-ctn-kix_xv318blpjdo-5}.lst-kix_5anu1k9tsyak-4>li:before{content:"\0025cb "}.lst-kix_s3mi7ukxwiwf-8>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-8}.lst-kix_s3mi7ukxwiwf-6>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-6,decimal) ". "}.lst-kix_fy6y7gyjejoh-8>li:before{content:"\0025a0 "}.lst-kix_1wulu3ra2vwv-5>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-5}.lst-kix_5anu1k9tsyak-0>li:before{content:"\0025cf "}.lst-kix_fy6y7gyjejoh-4>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-4.start{counter-reset:lst-ctn-kix_xv318blpjdo-4 0}.lst-kix_s3mi7ukxwiwf-2>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-2,lower-roman) ". "}.lst-kix_q97rvvc7c69e-8>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-4>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-4,decimal) ") "}.lst-kix_emhp84jkv42c-5>li{counter-increment:lst-ctn-kix_emhp84jkv42c-5}ol.lst-kix_xv318blpjdo-5.start{counter-reset:lst-ctn-kix_xv318blpjdo-5 0}.lst-kix_emhp84jkv42c-0>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-0,upper-roman) ". "}.lst-kix_emhp84jkv42c-8>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-8,lower-roman) ") "}.lst-kix_9jxnjym0nges-1>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-5.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-5 0}.lst-kix_1wulu3ra2vwv-5>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-5,lower-latin) ") "}.lst-kix_opi66v2qdsjs-1>li:before{content:"\0025cb "}.lst-kix_opi66v2qdsjs-5>li:before{content:"\0025a0 "}ol.lst-kix_emhp84jkv42c-7.start{counter-reset:lst-ctn-kix_emhp84jkv42c-7 0}ul.lst-kix_jkgkf1u9sy0c-4{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-5{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-6{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-7{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-8{list-style-type:none}ol.lst-kix_xv318blpjdo-6.start{counter-reset:lst-ctn-kix_xv318blpjdo-6 0}.lst-kix_1wulu3ra2vwv-0>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-0}ol.lst-kix_emhp84jkv42c-6.start{counter-reset:lst-ctn-kix_emhp84jkv42c-6 0}.lst-kix_9jxnjym0nges-5>li:before{content:"\0025a0 "}ul.lst-kix_6qnkx7t1adn9-8{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-4.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-4 0}ul.lst-kix_6qnkx7t1adn9-7{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-6{list-style-type:none}.lst-kix_86hsx13ssqid-3>li:before{content:"\0025cf "}ul.lst-kix_6qnkx7t1adn9-5{list-style-type:none}.lst-kix_sholqrhc62dh-3>li:before{content:"\0025cf "}ul.lst-kix_6qnkx7t1adn9-4{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-3{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-0{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-2{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-1{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-1{list-style-type:none}.lst-kix_1wulu3ra2vwv-1>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-1,upper-latin) ". "}ul.lst-kix_jkgkf1u9sy0c-2{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-0{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-3{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c22{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:270pt;border-top-color:#000000;border-bottom-style:solid}.c20{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:105.8pt;border-top-color:#000000;border-bottom-style:solid}.c19{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:92.2pt;border-top-color:#000000;border-bottom-style:solid}.c17{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:468pt;border-top-color:#000000;border-bottom-style:solid}.c12{color:#695d46;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:14pt;font-family:"PT Sans Narrow";font-style:normal}.c1{color:#695d46;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Open Sans";font-style:normal}.c29{padding-top:8pt;padding-bottom:0pt;line-height:1.2;page-break-after:avoid;orphans:2;widows:2}.c27{padding-top:16pt;padding-bottom:0pt;line-height:1.0;orphans:2;widows:2}.c31{padding-top:0pt;padding-bottom:0pt;line-height:1.2;orphans:2;widows:2}.c33{text-decoration:none;vertical-align:baseline;font-size:11pt;font-style:normal}.c11{font-size:18pt;font-family:"PT Sans Narrow";color:#ff5e0e;font-weight:700}.c0{margin-left:72pt;border-spacing:0;border-collapse:collapse;margin-right:auto}.c18{margin-left:36pt;border-spacing:0;border-collapse:collapse;margin-right:auto}.c21{font-size:42pt;font-family:"PT Sans Narrow";color:#695d46;font-weight:700}.c30{border-spacing:0;border-collapse:collapse;margin-right:auto}.c6{padding-top:24pt;padding-bottom:0pt;line-height:1.3;page-break-after:avoid}.c4{padding-top:0pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c7{padding-top:6pt;line-height:1.2;orphans:2;widows:2}.c14{font-size:11pt;font-family:"Trebuchet MS";text-decoration:underline}.c16{font-family:"Open Sans";color:#1155cc;text-decoration:underline}.c24{color:inherit;text-decoration:inherit}.c25{padding-bottom:0pt;text-align:left}.c10{margin-left:36pt;padding-left:0pt}.c9{padding:0;margin:0}.c28{max-width:468pt;padding:72pt 72pt 72pt 72pt}.c15{margin-left:72pt;padding-left:0pt}.c32{orphans:2;widows:2}.c13{color:#008575;font-family:"PT Sans Narrow"}.c2{color:#695d46;font-family:"Open Sans"}.c8{height:11pt}.c5{height:0pt}.c3{background-color:#ffffff}.c23{font-size:12pt}.c26{font-weight:700}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left} 

Oracle Fusion Middleware Deployments Using Docker Swarm

Overview

This is the first in a series of blogs that describe how to build a Fusion Middleware (FMW) Cluster that runs as a number of Docker images that run in docker containers.  These containers are coordinated using Docker Swarm and can be deployed to a single host machine or multiple hosts.  This simplifies the task of building FMW clusters and also makes it easier to scale them in and out (adding or subtracting host machines) as well as up and down (using bigger or smaller host machines).

This blog uses Oracle Service Bus as an FMW product but the principles are applicable to other FMW products.

In this entry we will explain the concepts of using Docker Swarm 1.12 to create a Fusion Middleware Cluster.  We will explain how to set up a minimal Linux machine to run a docker engine and prepare it to start building out a Fusion Middleware Cluster running on Swarm.  In future entries we will cover creating a database docker image that we will use to support Fusion Middleware.  Other entries will explain how to create a docker image to run Fusion Middleware and create a cluster in swarm mode by defining swarm services for the database, WebLogic Admin Server and WebLogic managed servers.

Goals
  1. Create FMW Cluster 12.2 that runs on Docker Swarm 1.12
  2. User Swarm to support scaling in/out of the FMW cluster.
Introduction

FMW deployments can be complex to setup and configure.  The Enterprise Deployment Guide for SOA Suite 12.2.1 has a lots of steps to follow within its 382 pages.  This is taken care of for you when you subscribe to FMW on the cloud, such as Oracle SOA Cloud Service.  However many companies still run their FMW deployments in on premise systems and are not yet ready to move to the Oracle Cloud Machine, which provides a private cloud environment that looks just like the public cloud.

Docker provides a lightweight container in which to run software.  Multiple docker images can be coordinated by Docker Swarm to form a cluster.  Each image runs in a docker container which virtualizes the resources used by the image, making it possible for multiple images to execute on a single machines or for images to to be distributed across multiple machines.  In either case Swarm helps to manage the cluster of machines.

There are a number of blog entries that explain how to use FMW with docker but most of them only use the developer install, which can run in a single docker image.  A more normal FMW installation has a separate database and multiple managed servers.  There a few blog entries that describe using this, but they use old versions of docker and there are now better ways of implementing this.  We use the latest versions of docker and swarm to show to create FMW clusters running on docker swarm in a configuration that is production ready.

Over this and the next few blog entries I have partnered with my colleague Shuxuan Nie to describe how to run a highly FMW deployment on top of Docker.  We have used Oracle Service Bus as an example FMW deployment but the principles can be applied to any FMW deployment.

AuthorsShuxuan ‘Judy’ Nie029.JPG

Holding a masters degree in computer science from Beijing University of Aeronautics and Astronautics Shuxuan Nie is a senior principal devops engineer working on Oracle's forthcoming Adaptive Intelligence Applications Cloud Service (AIA).  Prior to joining Oracle, Shuxuan worked as a systems architect at Australian based Oracle partner Rubicon Red.  There she specialized in helping customers build highly available FMW environments on both physical hardware and VMs.  She also contributed to Rubicon Reds Myst platform provisioning and continuous delivery tool.  In her current position she works with Oracle Container Cloud Service (which provides docker in the cloud) to provide deployment environments for the AIA cloud service.

Antony ReynoldsIMG_7082.JPG

A graduate of Bristol University Antony Reynolds is a Product Strategy Director in Oracle’sIntegration Products group where he works with Oracle Integration Cloud Service (ICS).  In addition to working with ICS he also helps customers upgrade to the latest SOA Suite releases, working closely with some of the largest users of SOA Suite in the world.  A blogger and author of several books on Oracle SOA Suite Antony was attracted to Docker by its lightweight container model and power of abstraction.

Architecture

FMW and WebLogic rely on a database and an Admin Server.  This leads us to require the following Docker images to implement FMW on Docker.  Each docker image runs in its own docker container.  The beauty of Docker is that these images can be deployed together on a single machine or distributed across multiple machines without any changes to their configuration.

Docker Containers for FMW Cluster

We could deploy all the images on a single machine as shown below.


Docker Containers Running FMW on a Single Powerful Machine

Alternatively we can distribute them across several machines.

Docker Containers Running FMW on Multiple Machines

Of course we could choose a combination of the two.


Docker Containers Running FMW on Multiple Machines, some Running Multiple Containers

Note that from the docker images perspective each thinks it is running in its own physical machine, although it is actually running in a docker container on a physical or virtual machines and may be sharing that machine with other running docker images.

Initially we deployed all the images to containers on a single machine, once we had that working then we deployed our images to multiple machines.

Docker & Swarm for FMW People

We are used to running FMW on multiple virtual machines.  This is used extensively on Oracle Exalogic for example, as well as the large number of customers who run FMW on Oracle Virtual Machine (OVM) or Dell’s VMWare.  The problem with VMs is that each virtual machine has a whole operating system that is running on top of the VM hypervisor.  This includes the kernel and file system which makes a VM a relatively heavyweight container.

In contrast to a Virtual Machine a Docker Container just abstracts the CPU, memory, network and file system of the underlying operating system.  It does not run a separate kernel, instead deferring most of the execution to the underlying machine,m physical or virtual.  This results in a lighter weight container that still has the benefits of isolation and abstraction that a VM provides.  This is why people are excited about using docker containers to host services, particularly micro services, that would be too expensive to dedicate a VM to.

A docker image is a specific set of binaries and configuration that is targeted to run inside a docker container.  This could be an Oracle database, a WebLogic managed server or a WebLogic admin server.

So let's translate FMW / WebLogic deployment terms onto docker concepts.  Note that this is a conceptual mapping, but is not an exact equivalent.

FMW ConceptDocker ConceptNotes

Machine

Docker Engine

Docker engine can run multiple docker containers on a single host.

Cluster

Swarm Cluster

Docker swarm clusters can be used to run multiple instances of an image, providing a great platform to run an FMW cluster on top of.

Node Manager

Swarm Manager

Manages the swarm cluster and decides on which docker engine to run a particular container.  Note that this function is split between Weblogic Console and Node Manager in WebLogic.

Binaries and Domain Configuration

Docker Image

A docker image represents a set of code and associated configuration packaged up for execution in a docker container.

Managed WebLogic Server in a Cluster

Swarm Service

A swarm service is a generic service.  A WebLogic Admin Server would be a Swarm Service with a single instance.  A Managed Server would be a Swarm Service that allowed multiple instances.

Note that although FMW allows multiple servers to be targeted at a single machine, docker achieves this through two level, a docker container runs a single server, but a docker engine can run multiple containers..  This is not as limiting as it sounds because a docker container is much lighter than a VM and so it is easy to run multiple docker containers on a docker engine running on a single VM or physical machine with minimal overhead on top of the requirements of the WebLogic server.

FMW for Docker People

Oracle Fusion Middleware is the name for Oracle’s middleware products.  These are powerful proprietary middleware products that are used by customers throughout the world to; run applications and portals, integrate systems, provide business analytics and secure their environments, amongst other things.

Although many of these products are available in free developer editions they still require acknowledgement of the Oracle license and as such cannot be distributed as part of a docker image.  These products can also be large, often requiring several gigabytes of download before being installed.  These factors when combined have led Oracle and others to provide dockerfiles to create docker images that install and configure Oracle products into provided base images.  The software to be installed must be provided separately from the dockerfiles.  The created docker images can then stored in a company specific docker repository.  These docker images can then be used in the same way as any other docker image.  This is the approach that will be followed in this document.

Base VM Image

We built on a headless and minimum rpm installed Oracle Enterprise Linux 7 VM that has a download footprint of only 1GB.  The instructions provided are applicable to other OEL 7 and RHEL 7 environments.  With minimal changes the same instructions should also apply to other Linux releases such as Ubuntu.  The image is configured and set up with a docker environment.

The VM is used as our base platform to run docker.

Downloading VM

Because of licensing restrictions we are unable to provide a VM for download.  However if you are an Oracle employee then please contact us and we will point you at a downloadable image.

Image Pre-Requisites

If you don’t use the provided image then the following is needed of an OEL 7 image.

  • As root run yum util to enable UEKR4 and addons in yum repo

yum -y install yum-utils

yum-config-manager --enable ol7_addons

yum-config-manager --enable ol7_UEKR4

yum-config-manager --disable ol7_UEKR3_latest

  • Install 4.x kernel and reboot the system, selecting the UEK R4 kernel if this is not the default boot kernel

yum update

systemctl reboot

  • Install minimum required packages

yum install wget unzip net-tools

  • Provide btrfs file system as storage driver used by docker instead of default device mapper.  We will refer to the root of the btrfs file system as /var/lib/docker
  • Use yum to install btrfs-progs package

root@docker-base ~]# yum install btrfs-progs

  • Create btrfs file system on the device, such as /dev/sdb in this example.

root@docker-base ~]# mkfs.btrfs /dev/sdb

  • Display UUID of the device via blkid command

[root@docker-base ~]# blkid /dev/sdb

/dev/sdb: UUID="fe6bf7a2-34fc-4800-af2b-da19d2d8db6d" UUID_SUB="e955087d-80b5-4051-bb28-ed71edb9cea4" TYPE="btrfs"

  • Create the config file /etc/systemd/system/var-lib-docker.mount with below content, replace your UUID value:

[Unit]

Description = Docker Image Store

[Mount]

What = UUID=<Your UUID Value>

Where = /var/lib/docker

Type = btrfs

[Install]

WantedBy = multi-user.target

  • The above file defines systemd users to mount the file system on /var/lib/docker, need to create this folder if this is the fresh installation

[root@docker-base ~]# mkdir /var/lib/docker

  • Enable var-lib-docker.mount target and mount the file system

[root@docker-base ~]# systemctl enable var-lib-docker.mount

[root@docker-base ~]# systemctl start var-lib-docker.mount

  • Create the  /etc/systemd/system/docker.service.d/var-lib-docker-mount.conf to tell systemd to mount the /var/lib/docker file system by using the var-lib-docker.mount target before starting the docker service

[Unit]

Requires=var-lib-docker.mount

After=var-lib-docker.mount

  • Set the SELinux mode to permissive or disable SELinux. In this demo, we disable SELinux in /etc/selinux/config.  We do this to avoid having to configure selinux policies to run docker.  Your Linux security team may require you to set up an appropriate policy.

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#     enforcing - SELinux security policy is enforced.

#     permissive - SELinux prints warnings instead of enforcing.

#     disabled - No SELinux policy is loaded.

SELINUX=disabled

# SELINUXTYPE= can take one of three two values:

#     targeted - Targeted processes are protected,

#     minimum - Modification of targeted policy. Only selected processes are protected.

#     mls - Multi Level Security protection.

SELINUXTYPE=targeted

                The above change requires to reboot the system

[root@docker-base ~]# systemctl reboot

  • Install docker engine, in our demo we install latest version 1.12

[root@docker-base ~]# yum install docker-engine

  • Start docker service and set to auto start

[root@docker-base ~]# systemctl start docker

[root@docker-base ~]# systemctl enable docker

  • Check docker running status

[root@docker-base ~]# systemctl status docker

● docker.service - Docker Application Container Engine

   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)

  Drop-In: /etc/systemd/system/docker.service.d

           └─docker-network.conf, docker-sysconfig.conf, http-proxy.conf, var-lib-docker-mount.conf

   Active: active (running) since Sun 2017-01-08 12:16:38 PST; 52min ago

     Docs: https://docs.docker.com

 Main PID: 871 (dockerd)

   Memory: 64.7M

   CGroup: /system.slice/docker.service

           ├─ 871 dockerd --selinux-enabled

           └─1020 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0...

  • Display docker information, you can verify the version and btrfs storage driver

[root@docker-base ~]# docker info

Containers: 0

 Running: 0

 Paused: 0

 Stopped: 0

Images: 0

Server Version: 1.12.2

Storage Driver: btrfs

 Build Version: Btrfs v3.19.1

 Library Version: 101

Logging Driver: json-file

Cgroup Driver: cgroupfs

Plugins:

 Volume: local

 Network: null host bridge overlay

Swarm: inactive

Runtimes: runc

Default Runtime: runc

Security Options: seccomp

Kernel Version: 4.1.12-61.1.24.el7uek.x86_64

Operating System: Oracle Linux Server 7.3

OSType: linux

Architecture: x86_64

CPUs: 1

Total Memory: 4.133 GiB

Name: docker-base.us.oracle.com

ID: ELNP:SGZ6:MUMH:FWOC:3BZ2:NZOA:KBKQ:3RT2:ADS4:AX5T:M5YT:RLXR

Docker Root Dir: /var/lib/docker

Debug Mode (client): false

Debug Mode (server): false

Registry: https://index.docker.io/v1/

Insecure Registries:

 127.0.0.0/8

  • Create oracle user
  • useradd oracle
  • Add oracle user to docker group
  • usermod -a -G docker oracle
Summary

In this entry we have introduced the concept of using Docker Swarm 1.12 to create a Fusion Middleware Cluster.  We have explained how to set up a minimal Linux machine to run a docker engine and prepared it to start building out a Fusion Middleware Cluster running on Swarm.  In our next entry we will cover creating a database docker image that we will use in later entries to support Fusion Middleware.  Later entries will explain how to install Fusion Middleware and create a cluster in swarm mode by defining swarm services for the database, WebLogic Admin Server and WebLogic managed servers.

Slicing the EDG

Tue, 2014-08-19 21:24
Different SOA Domain Configurations

In this blog entry I would like to introduce three different configurations for a SOA environment.  I have omitted load balancers and OTD/OHS as they introduce a whole new round of discussion.  For each possible deployment architecture I have identified some of the advantages.

Super Domain

This is a single EDG style domain for everything needed for SOA/OSB.   It extends the standard EDG slightly but otherwise assumes a single “super” domain.

This is basically the SOA EDG.  I have broken out JMS servers and Coherence servers to improve scalability and reduce dependencies.Key Points

  • Separate JMS allows those servers to be kept up separately from rest of SOA Domain, allowing JMS clients to post messages even if rest of domain is unavailable.
  • JMS servers are only used to host application specific JMS destinations, SOA/OSB JMS destinations remain in relevant SOA/OSB managed servers.
  • Separate Coherence servers allow OSB cache to be offloaded from OSB servers.
  • Use of Coherence by other components as a shared infrastructure data grid service.
  • Coherence cluster may be managed by WLS but more likely run as a standalone Coherence cluster.
Benefits
  • Single Administration Point (1 Admin Server)
  • Closely follows EDG with addition of application specific JMS servers and standalone Coherence servers for OSB caching and application specific caches.
  • Coherence grid can be scaled independent of OSB/SOA.
  • JMS queues provide for inter-application communication.
Drawbacks
  • Patching is an all or nothing affair.
  • Startup time for SOA may be slow if large number of composites deployed.
Multiple Domains

This extends the EDG into multiple domains, allowing separate management and update of these domains.  I see this type of configuration quite often with customers, although some don't have OWSM, others don't have separate Coherence etc.

SOA & BAM are kept in the same domain as little benefit is obtained by separating them.Key Points

  • Separate JMS allows those servers to be kept up separately from rest of SOA Domain, allowing JMS clients to post messages even if other domains are unavailable.
  • JMS servers are only used to host application specific JMS destinations, SOA/OSB JMS destinations remain in relevant SOA/OSB managed servers.
  • Separate Coherence servers allow OSB cache to be offloaded from OSB servers.
  • Use of Coherence by other components as a shared infrastructure data grid service.
  • Coherence cluster may be managed by WLS but more likely run as a standalone Coherence cluster.
Benefits
  • Follows EDG but in separate domains and with addition of application specific JMS servers and standalone Coherence servers for OSB caching and application specific caches.
  • Coherence grid can be scaled independent of OSB/SOA.
  • JMS queues provide for inter-application communication.
  • Patch lifecycle of OSB/SOA/JMS are no longer lock stepped.
  • JMS may be kept running independently of other domains allowing applications to insert messages fro later consumption by SOA/OSB.
  • OSB may be kept running independent of other domains, allowing service virtualization to continue independent of other domains availability.
  • All domains use same OWSM policy store (MDS-WSM).
Drawbacks
  • Multiple domains to manage and configure.
  • Multiple Admin servers (single view requires use of Grid Control)
  • Multiple Admin servers/WSM clusters waste resources.
  • Additional homes needed to enjoy benefits of separate patching.
  • Cross domain trust needs setting up to simplify cross domain interactions.
  • Startup time for SOA may be slow if large number of composites deployed.
Shared Service Environment

This model extends the previous multiple domain arrangement to provide a true shared service environment.

This extends the previous model by allowing multiple additional SOA domains and/or other domains to take advantage of the shared services.  Only one non-shared domain is shown, but there could be multiple, allowing groups of applications to share patching independent of other application groups.Key Points

  • Separate JMS allows those servers to be kept up separately from rest of SOA Domain, allowing JMS clients to post messages even if other domains are unavailable.
  • JMS servers are only used to host application specific JMS destinations, SOA/OSB JMS destinations remain in relevant SOA/OSB managed servers.
  • Separate Coherence servers allow OSB cache to be offloaded from OSB servers.
  • Use of Coherence by other components as a shared infrastructure data grid service
  • Coherence cluster may be managed by WLS but more likely run as a standalone Coherence cluster.
  • Shared SOA Domain hosts
    • Human Workflow Tasks
    • BAM
    • Common "utility" composites
  • Single OSB domain provides "Enterprise Service Bus"
  • All domains use same OWSM policy store (MDS-WSM)
Benefits
  • Follows EDG but in separate domains and with addition of application specific JMS servers and standalone Coherence servers for OSB caching and application specific caches.
  • Coherence grid can be scaled independent of OSB/SOA.
  • JMS queues provide for inter-application communication.
  • Patch lifecycle of OSB/SOA/JMS are no longer lock stepped.
  • JMS may be kept running independently of other domains allowing applications to insert messages fro later consumption by SOA/OSB.
  • OSB may be kept running independent of other domains, allowing service virtualization to continue independent of other domains availability.
  • All domains use same OWSM policy store (MDS-WSM).
  • Supports large numbers of deployed composites in multiple domains.
  • Single URL for Human Workflow end users.
  • Single URL for BAM end users.
Drawbacks
  • Multiple domains to manage and configure.
  • Multiple Admin servers (single view requires use of Grid Control)
  • Multiple Admin servers/WSM clusters waste resources.
  • Additional homes needed to enjoy benefits of separate patching.
  • Cross domain trust needs setting up to simplify cross domain interactions.
  • Human Workflow needs to be specially configured to point to shared services domain.
Summary

The alternatives in this blog allow for patching to have different impacts, depending on the model chosen.  Each organization must decide the tradeoffs for itself.  One extreme is to go for the shared services model and have one domain per SOA application.  This requires a lot of administration of the multiple domains.  The other extreme is to have a single super domain.  This makes the entire enterprise susceptible to an outage at the same time due to patching or other domain level changes.  Hopefully this blog will help your organization choose the right model for you.

Slicing the EDG

Tue, 2014-08-19 21:24
Different SOA Domain Configurations

In this blog entry I would like to introduce three different configurations for a SOA environment.  I have omitted load balancers and OTD/OHS as they introduce a whole new round of discussion.  For each possible deployment architecture I have identified some of the advantages.

Super Domain

This is a single EDG style domain for everything needed for SOA/OSB.   It extends the standard EDG slightly but otherwise assumes a single “super” domain.

This is basically the SOA EDG.  I have broken out JMS servers and Coherence servers to improve scalability and reduce dependencies. Key Points

  • Separate JMS allows those servers to be kept up separately from rest of SOA Domain, allowing JMS clients to post messages even if rest of domain is unavailable.
  • JMS servers are only used to host application specific JMS destinations, SOA/OSB JMS destinations remain in relevant SOA/OSB managed servers.
  • Separate Coherence servers allow OSB cache to be offloaded from OSB servers.
  • Use of Coherence by other components as a shared infrastructure data grid service.
  • Coherence cluster may be managed by WLS but more likely run as a standalone Coherence cluster.
Benefits
  • Single Administration Point (1 Admin Server)
  • Closely follows EDG with addition of application specific JMS servers and standalone Coherence servers for OSB caching and application specific caches.
  • Coherence grid can be scaled independent of OSB/SOA.
  • JMS queues provide for inter-application communication.
Drawbacks
  • Patching is an all or nothing affair.
  • Startup time for SOA may be slow if large number of composites deployed.
Multiple Domains

This extends the EDG into multiple domains, allowing separate management and update of these domains.  I see this type of configuration quite often with customers, although some don't have OWSM, others don't have separate Coherence etc.

SOA & BAM are kept in the same domain as little benefit is obtained by separating them. Key Points

  • Separate JMS allows those servers to be kept up separately from rest of SOA Domain, allowing JMS clients to post messages even if other domains are unavailable.
  • JMS servers are only used to host application specific JMS destinations, SOA/OSB JMS destinations remain in relevant SOA/OSB managed servers.
  • Separate Coherence servers allow OSB cache to be offloaded from OSB servers.
  • Use of Coherence by other components as a shared infrastructure data grid service.
  • Coherence cluster may be managed by WLS but more likely run as a standalone Coherence cluster.
Benefits
  • Follows EDG but in separate domains and with addition of application specific JMS servers and standalone Coherence servers for OSB caching and application specific caches.
  • Coherence grid can be scaled independent of OSB/SOA.
  • JMS queues provide for inter-application communication.
  • Patch lifecycle of OSB/SOA/JMS are no longer lock stepped.
  • JMS may be kept running independently of other domains allowing applications to insert messages fro later consumption by SOA/OSB.
  • OSB may be kept running independent of other domains, allowing service virtualization to continue independent of other domains availability.
  • All domains use same OWSM policy store (MDS-WSM).
Drawbacks
  • Multiple domains to manage and configure.
  • Multiple Admin servers (single view requires use of Grid Control)
  • Multiple Admin servers/WSM clusters waste resources.
  • Additional homes needed to enjoy benefits of separate patching.
  • Cross domain trust needs setting up to simplify cross domain interactions.
  • Startup time for SOA may be slow if large number of composites deployed.
Shared Service Environment

This model extends the previous multiple domain arrangement to provide a true shared service environment.

This extends the previous model by allowing multiple additional SOA domains and/or other domains to take advantage of the shared services.  Only one non-shared domain is shown, but there could be multiple, allowing groups of applications to share patching independent of other application groups. Key Points

  • Separate JMS allows those servers to be kept up separately from rest of SOA Domain, allowing JMS clients to post messages even if other domains are unavailable.
  • JMS servers are only used to host application specific JMS destinations, SOA/OSB JMS destinations remain in relevant SOA/OSB managed servers.
  • Separate Coherence servers allow OSB cache to be offloaded from OSB servers.
  • Use of Coherence by other components as a shared infrastructure data grid service
  • Coherence cluster may be managed by WLS but more likely run as a standalone Coherence cluster.
  • Shared SOA Domain hosts
    • Human Workflow Tasks
    • BAM
    • Common "utility" composites
  • Single OSB domain provides "Enterprise Service Bus"
  • All domains use same OWSM policy store (MDS-WSM)
Benefits
  • Follows EDG but in separate domains and with addition of application specific JMS servers and standalone Coherence servers for OSB caching and application specific caches.
  • Coherence grid can be scaled independent of OSB/SOA.
  • JMS queues provide for inter-application communication.
  • Patch lifecycle of OSB/SOA/JMS are no longer lock stepped.
  • JMS may be kept running independently of other domains allowing applications to insert messages fro later consumption by SOA/OSB.
  • OSB may be kept running independent of other domains, allowing service virtualization to continue independent of other domains availability.
  • All domains use same OWSM policy store (MDS-WSM).
  • Supports large numbers of deployed composites in multiple domains.
  • Single URL for Human Workflow end users.
  • Single URL for BAM end users.
Drawbacks
  • Multiple domains to manage and configure.
  • Multiple Admin servers (single view requires use of Grid Control)
  • Multiple Admin servers/WSM clusters waste resources.
  • Additional homes needed to enjoy benefits of separate patching.
  • Cross domain trust needs setting up to simplify cross domain interactions.
  • Human Workflow needs to be specially configured to point to shared services domain.
Summary

The alternatives in this blog allow for patching to have different impacts, depending on the model chosen.  Each organization must decide the tradeoffs for itself.  One extreme is to go for the shared services model and have one domain per SOA application.  This requires a lot of administration of the multiple domains.  The other extreme is to have a single super domain.  This makes the entire enterprise susceptible to an outage at the same time due to patching or other domain level changes.  Hopefully this blog will help your organization choose the right model for you.

Coherence Adapter Configuration

Thu, 2014-07-03 00:05
SOA Suite 12c Coherence Adapter

The release of SOA Suite 12c sees the addition of a Coherence Adapter to the list of Technology Adapters that are licensed with the SOA Suite.  In this entry I provide an introduction to configuring the adapter and using the different operations it supports.

The Coherence Adapter provides access to Oracles Coherence Data Grid.  The adapter provides access to the cache capabilities of the grid, it does not currently support the many other features of the grid such as entry processors – more on this at the end of the blog.

Previously if you wanted to use Coherence from within SOA Suite you either used the built in caching capability of OSB or resorted to writing Java code wrapped as a Spring component.  The new adapter significantly simplifies simple cache access operations.

Configuration

When creating a SOA domain the Coherence adapter is shipped with a very basic configuration that you will probably want to enhance to support real requirements.  In this section I look at the configuration required to use Coherence adapter in the real world.

Activate Adapter

The Coherence Adapter is not targeted at the SOA server by default, so this targeting needs to be performed from within the WebLogic console before the adapter can be used.

Create a cache configuration file

The Coherence Adapter provides a default connection factory to connect to an out-of-box Coherence cache and also a cache called adapter-local.  This is helpful as an example but it is good practice to only have a single type of object within a Coherence cache, so we will need more than one.  Without having multiple caches then it is hard to clean out all the objects of a particular type.  Having multiple caches also allows us to specify different properties for each cache.  The following is a sample cache configuration file used in the example.

<?xml version="1.0"?>
<!DOCTYPE cache-config SYSTEM "cache-config.dtd">
<cache-config>
  <caching-scheme-mapping>
    <cache-mapping>
      <cache-name>TestCache</cache-name>
      <scheme-name>transactional</scheme-name>
    </cache-mapping>
  </caching-scheme-mapping>
  <caching-schemes>
    <transactional-scheme>
      <scheme-name>transactional</scheme-name>
      <service-name>DistributedCache</service-name>
      <autostart>true</autostart>
    </transactional-scheme>
  </caching-schemes>
</cache-config>

This defines a single cache called TestCache.  This is a distributed cache, meaning that the entries in the cache will distributed across the grid.  This enables you to scale the storage capacity of the grid by adding more servers.  Additional caches can be added to this configuration file by adding additional <cache-mapping> elements.

The cache configuration file is reference by the adapter connection factory and so needs to be on a file system accessed by all servers running the Coherence Adapter.  It is not referenced from the composite.

Create a Coherence Adapter Connection Factory

We find the correct cache configuration by using a Coherence Adapter connection factory.  The adapter ships with a few sample connection factories but we will create new one.  To create a new connection factory we do the following:

  1. On the Outbound Connection Pools tab of the Coherence Adapter deployment we select New to create the adapter.
  2. Choose the javax.resource.cci.ConnectionFactory group.
  3. Provide a JNDI name, although you can use any name something along the lines of eis/Coherence/Test is a good practice (EIS tells us this an adapter JNDI, Coherence tells us it is the Coherence Adapter, and then we can identify which adapter configuration we are using).
  4. If requested to create a Plan.xml then make sure that you save it in a location available to all servers.
  5. From the outbound connection pool tab select your new connection factory so that you can configure it from the properties tab.
    • Set the CacheConfigLocation to point to the cache configuration file created in the previous section.
    • Set the ClassLoaderMode to CUSTOM.
    • Set the ServiceName to the name of the service used by your cache in the cache configuration file created in the previous section.
    • Set the WLSExtendProxy to false unless your cache configuration file is using an extend proxy.
    • If you plan on using POJOs (Plain Old Java Objects) with the adapter rather than XML then you need to point the PojoJarFile at the location of a jar file containing your POJOs.
    • Make sure to press enter in each field after entering your data.  Remember to save your changes when done.

You may will need to stop and restart the adapter to get it to recognize the new connection factory.

Operations

To demonstrate the different operations I created a WSDL with the following operations:

  • put – put an object into the cache with a given key value.
  • get – retrieve an object from the cache by key value.
  • remove – delete an object from the cache by key value.
  • list – retrieve all the objects in the cache.
  • listKeys – retrieve all the keys of the objects in the cache.
  • removeAll – remove all the objects from the cache.

I created a composite based on this WSDL that calls a different adapter reference for each operation.  Details on configuring the adapter within a composite are provided in the Configuring the Coherence Adapter section of the documentation.

I used a Mediator to map the input WSDL operations to the individual adapter references.

Schema

The input schema is shown below.

This type of pattern is likely to be used in all XML types stored in a Coherence cache.  The XMLCacheKey element represents the cache key, in this schema it is a string, but could be another primitive type.  The other fields in the cached object are represented by a single XMLCacheContent field, but in a real example you are likely to have multiple fields at this level.  Wrapper elements are provided for lists of elements (XMLCacheEntryList) and lists of cache keys (XMLCacheEntryKeyList).  XMLEmpty is used for operation that don’t require an input.

Put Operation

The put operation takes an XMLCacheEntry as input and passes this straight through to the adapter.  The XMLCacheKey element in the entry is also assigned to the jca.coherence.key property.  This sets the key for the cached entry.  The adapter also supports automatically generating a key, which is useful if you don’t have a convenient field in the cached entity.  The cache key is always returned as the output of this operation.

Get Operation

The get operation takes an XMLCacheKey as input and assigns this to the jca.coherence.key property. This sets the key for the entry to be retrieved.

Remove Operation

The remove operation takes an XMLCacheKey as input and assigns this to the jca.coherence.key property. This sets the key for the entry to be deleted.

RemoveAll Operation

This is similar to the remove operation but instead of using a key as input to the remove operation it uses a filter.  The filter could be overridden by using the jca.coherence.filter property but for this operation it was permanently set in the adapter wizard to be the following query:

key() != ""

This selects all objects whose key is not equal to the empty string.  All objects should have a key so this query should select all objects for deletion.

Note that there appears to be a bug in the return value.  The return value is entry rather than having the expected RemoveResponse element with a Count child element.  Note the documentation states that

When using a filter for a Remove operation, the Coherence Adapter does not report the count of entries affected by the remove operation, regardless of whether the remove operation is successful.

When using a key to remove a specific entry, the Coherence Adapter does report the count, which is always 1 if a Coherence Remove operation is successful.

Although this could be interpreted as meaning an empty part is returned, an empty part is a violation of the WSDL contract.

List Operation

The list operation takes no input and returns the result list returned by the adapter.  The adapter also supports querying using a filter.  This filter is essentially the where clause of a Coherence Query Language statement.  When using XML types as cached entities then only the key() field can be tested, for example using a clause such as:

key() LIKE “Key%1”

This filter would match all entries whose key starts with “Key” and ends with “1”.

ListKeys Operation

The listKeys operation is essentially the same as the list operation except that only the keys are returned rather than the whole object.

Testing

To test the composite I used the new 12c Test Suite wizard to create a number of test suites.  The test suites should be executed in the following order:

  1. CleanupTestSuite has a single test that removes all the entries from the cache used by this composite.
  2. InitTestSuite has 3 tests that insert a single record into the cache.  The returned key is validated against the expected value.
  3. MainTestSuite has 5 tests that list the elements and keys in the cache and retrieve individual inserted elements.  This tests that the items inserted in the previous test are actually in the cache.  It also tests the get, list and listAll operations and makes sure they return the expected results.
  4. RemoveTestSuite has a single test that removes an element from the cache and tests that the count of removed elements is 1.
  5. ValidateRemoveTestSuite is similar to MainTestSuite but verifies that the element removed by the previous test suite has actually been removed.
Use Case

One example of using the Coherence Adapter is to create a shared memory region that allows SOA composites to share information.  An example of this is provided by Lucas Jellema in his blog entry First Steps with the Coherence Adapter to create cross instance state memory.

However there is a problem in creating global variables that can be updated by multiple instances at the same time.  In this case the get and put operations provided by the Coherence adapter support a last write wins model.  This can be avoided in Coherence by using an Entry Processor to update the entry in the cache, but currently entry processors are not supported by the Coherence Adapter.  In this case it is still necessary to use Java to invoke the entry processor.

Sample Code

The sample code I refer to above is available for download and consists of two JDeveloper projects, one with the cache config file and the other with the Coherence composite.

  • CoherenceConfig has the cache config file that must be referenced by the connection factory properties.
  • CoherenceSOA has a composite that supports the WSDL introduced at the start of this blog along with the test cases mentioned at the end of the blog.

The Coherence Adapter is a really exciting new addition to the SOA developers toolkit, hopefully this article will help you make use of it.

Coherence Adapter Configuration

Thu, 2014-07-03 00:05
SOA Suite 12c Coherence Adapter

The release of SOA Suite 12c sees the addition of a Coherence Adapter to the list of Technology Adapters that are licensed with the SOA Suite.  In this entry I provide an introduction to configuring the adapter and using the different operations it supports.

The Coherence Adapter provides access to Oracles Coherence Data Grid.  The adapter provides access to the cache capabilities of the grid, it does not currently support the many other features of the grid such as entry processors – more on this at the end of the blog.

Previously if you wanted to use Coherence from within SOA Suite you either used the built in caching capability of OSB or resorted to writing Java code wrapped as a Spring component.  The new adapter significantly simplifies simple cache access operations.

Configuration

When creating a SOA domain the Coherence adapter is shipped with a very basic configuration that you will probably want to enhance to support real requirements.  In this section I look at the configuration required to use Coherence adapter in the real world.

Activate Adapter

The Coherence Adapter is not targeted at the SOA server by default, so this targeting needs to be performed from within the WebLogic console before the adapter can be used.

Create a cache configuration file

The Coherence Adapter provides a default connection factory to connect to an out-of-box Coherence cache and also a cache called adapter-local.  This is helpful as an example but it is good practice to only have a single type of object within a Coherence cache, so we will need more than one.  Without having multiple caches then it is hard to clean out all the objects of a particular type.  Having multiple caches also allows us to specify different properties for each cache.  The following is a sample cache configuration file used in the example.

<?xml version="1.0"?>
<!DOCTYPE cache-config SYSTEM "cache-config.dtd">
<cache-config>
  <caching-scheme-mapping>
    <cache-mapping>
      <cache-name>TestCache</cache-name>
      <scheme-name>transactional</scheme-name>
    </cache-mapping>
  </caching-scheme-mapping>
  <caching-schemes>
    <transactional-scheme>
      <scheme-name>transactional</scheme-name>
      <service-name>DistributedCache</service-name>
      <autostart>true</autostart>
    </transactional-scheme>
  </caching-schemes>
</cache-config>

This defines a single cache called TestCache.  This is a distributed cache, meaning that the entries in the cache will distributed across the grid.  This enables you to scale the storage capacity of the grid by adding more servers.  Additional caches can be added to this configuration file by adding additional <cache-mapping> elements.

The cache configuration file is reference by the adapter connection factory and so needs to be on a file system accessed by all servers running the Coherence Adapter.  It is not referenced from the composite.

Create a Coherence Adapter Connection Factory

We find the correct cache configuration by using a Coherence Adapter connection factory.  The adapter ships with a few sample connection factories but we will create new one.  To create a new connection factory we do the following:

  1. On the Outbound Connection Pools tab of the Coherence Adapter deployment we select New to create the adapter.
  2. Choose the javax.resource.cci.ConnectionFactory group.
  3. Provide a JNDI name, although you can use any name something along the lines of eis/Coherence/Test is a good practice (EIS tells us this an adapter JNDI, Coherence tells us it is the Coherence Adapter, and then we can identify which adapter configuration we are using).
  4. If requested to create a Plan.xml then make sure that you save it in a location available to all servers.
  5. From the outbound connection pool tab select your new connection factory so that you can configure it from the properties tab.
    • Set the CacheConfigLocation to point to the cache configuration file created in the previous section.
    • Set the ClassLoaderMode to CUSTOM.
    • Set the ServiceName to the name of the service used by your cache in the cache configuration file created in the previous section.
    • Set the WLSExtendProxy to false unless your cache configuration file is using an extend proxy.
    • If you plan on using POJOs (Plain Old Java Objects) with the adapter rather than XML then you need to point the PojoJarFile at the location of a jar file containing your POJOs.
    • Make sure to press enter in each field after entering your data.  Remember to save your changes when done.

You may will need to stop and restart the adapter to get it to recognize the new connection factory.

Operations

To demonstrate the different operations I created a WSDL with the following operations:

  • put – put an object into the cache with a given key value.
  • get – retrieve an object from the cache by key value.
  • remove – delete an object from the cache by key value.
  • list – retrieve all the objects in the cache.
  • listKeys – retrieve all the keys of the objects in the cache.
  • removeAll – remove all the objects from the cache.

I created a composite based on this WSDL that calls a different adapter reference for each operation.  Details on configuring the adapter within a composite are provided in the Configuring the Coherence Adapter section of the documentation.

I used a Mediator to map the input WSDL operations to the individual adapter references.

Schema

The input schema is shown below.

This type of pattern is likely to be used in all XML types stored in a Coherence cache.  The XMLCacheKey element represents the cache key, in this schema it is a string, but could be another primitive type.  The other fields in the cached object are represented by a single XMLCacheContent field, but in a real example you are likely to have multiple fields at this level.  Wrapper elements are provided for lists of elements (XMLCacheEntryList) and lists of cache keys (XMLCacheEntryKeyList).  XMLEmpty is used for operation that don’t require an input.

Put Operation

The put operation takes an XMLCacheEntry as input and passes this straight through to the adapter.  The XMLCacheKey element in the entry is also assigned to the jca.coherence.key property.  This sets the key for the cached entry.  The adapter also supports automatically generating a key, which is useful if you don’t have a convenient field in the cached entity.  The cache key is always returned as the output of this operation.

Get Operation

The get operation takes an XMLCacheKey as input and assigns this to the jca.coherence.key property. This sets the key for the entry to be retrieved.

Remove Operation

The remove operation takes an XMLCacheKey as input and assigns this to the jca.coherence.key property. This sets the key for the entry to be deleted.

RemoveAll Operation

This is similar to the remove operation but instead of using a key as input to the remove operation it uses a filter.  The filter could be overridden by using the jca.coherence.filter property but for this operation it was permanently set in the adapter wizard to be the following query:

key() != ""

This selects all objects whose key is not equal to the empty string.  All objects should have a key so this query should select all objects for deletion.

Note that there appears to be a bug in the return value.  The return value is entry rather than having the expected RemoveResponse element with a Count child element.  Note the documentation states that

When using a filter for a Remove operation, the Coherence Adapter does not report the count of entries affected by the remove operation, regardless of whether the remove operation is successful.

When using a key to remove a specific entry, the Coherence Adapter does report the count, which is always 1 if a Coherence Remove operation is successful.

Although this could be interpreted as meaning an empty part is returned, an empty part is a violation of the WSDL contract.

List Operation

The list operation takes no input and returns the result list returned by the adapter.  The adapter also supports querying using a filter.  This filter is essentially the where clause of a Coherence Query Language statement.  When using XML types as cached entities then only the key() field can be tested, for example using a clause such as:

key() LIKE “Key%1”

This filter would match all entries whose key starts with “Key” and ends with “1”.

ListKeys Operation

The listKeys operation is essentially the same as the list operation except that only the keys are returned rather than the whole object.

Testing

To test the composite I used the new 12c Test Suite wizard to create a number of test suites.  The test suites should be executed in the following order:

  1. CleanupTestSuite has a single test that removes all the entries from the cache used by this composite.
  2. InitTestSuite has 3 tests that insert a single record into the cache.  The returned key is validated against the expected value.
  3. MainTestSuite has 5 tests that list the elements and keys in the cache and retrieve individual inserted elements.  This tests that the items inserted in the previous test are actually in the cache.  It also tests the get, list and listAll operations and makes sure they return the expected results.
  4. RemoveTestSuite has a single test that removes an element from the cache and tests that the count of removed elements is 1.
  5. ValidateRemoveTestSuite is similar to MainTestSuite but verifies that the element removed by the previous test suite has actually been removed.
Use Case

One example of using the Coherence Adapter is to create a shared memory region that allows SOA composites to share information.  An example of this is provided by Lucas Jellema in his blog entry First Steps with the Coherence Adapter to create cross instance state memory.

However there is a problem in creating global variables that can be updated by multiple instances at the same time.  In this case the get and put operations provided by the Coherence adapter support a last write wins model.  This can be avoided in Coherence by using an Entry Processor to update the entry in the cache, but currently entry processors are not supported by the Coherence Adapter.  In this case it is still necessary to use Java to invoke the entry processor.

Sample Code

The sample code I refer to above is available for download and consists of two JDeveloper projects, one with the cache config file and the other with the Coherence composite.

  • CoherenceConfig has the cache config file that must be referenced by the connection factory properties.
  • CoherenceSOA has a composite that supports the WSDL introduced at the start of this blog along with the test cases mentioned at the end of the blog.

The Coherence Adapter is a really exciting new addition to the SOA developers toolkit, hopefully this article will help you make use of it.

One Queue to Rule them All

Fri, 2014-03-28 16:16
Using a Single Queue for Multiple Message Types with SOA SuiteProblem StatementYou use a single JMS queue for sending multiple message types /  service requests.  You use a single JMS queue for receiving multiple message types / service requests.  You have multiple SOA JMS Adapter interfaces for reading and writing these queues.  In a composite it is random which interface gets a message from the JMS queue.  It is not a problem having multiple adapter instances writing to a single queue, the problem is only with having multiple readers because each reader gets the first message on the queue. Background

The JMS Adapter is unaware of who receives the messages.  Each adapter instance just takes the message from the queue and delivers it to its own configured interface, one interface per adapter instance.  The SOA infrastructure is then responsible for routing that message, usually via a database table and an in memory notification message, to a component within a composite.  Each message will create a new composite but the BPEL engine and Mediator engine will attempt to match callback messages to the appropriate Mediator or BPEL instance.
Note that message type, including XML document type, has nothing to do with the preceding statements.

The net result is that if you have a sequence of two receives from the same queue using different adapters then the messages will be split equally between the two adapters, meaning that half the time the wrong adapter will receive the message.  This blog entry looks at how to resolve this issue.

Note that the same problem occurs whenever you have more than 1 adapter listening to the same queue, whether they are in the same composite or different composites.  The solution in this blog entry is also relevant to this use case.

SolutionsIn order to correctly deliver the messages to the correct interface we need to identify the interface they should be delivered to.  This can be done by using JMS properties.  For example the JMSType property can be used to identify the type of the message.  A message selector can be added to the JMS inbound adapter that will cause the adapter to filter out messages intended for other interfaces.  For example if we need to call three services that are implemented in a single application:
  • Service 1 receives messages on the single outbound queue from SOA, it send responses back on the single inbound queue.
  • Similarly Service 2 and Service 3 also receive messages on the single outbound queue from SOA, they send responses back on the single inbound queue.
First we need to ensure the messages are delivered to the correct adapter instance.  This is achieved as follows:
  • aThe inbound JMS adapter is configured with a JMS message selector.  The message selector might be "JMSType='Service1'" for responses from Service 1.  Similarly the selector would be "JMSType='Service2'" for the adapter waiting on a response from Service 2.  The message selector ensures that each adapter instance will retrieve the first message from the queue that matches its selector.
  • The sending service needs to set the JMS property (JMSType in our example) that is used in the message selector.
Now our messages are being delivered to the correct interface we need to make sure that they get delivered to the correct Mediator or BPEL instance.  We do this with correlation.  There are several correlation options:
  1. We can do manual correlation with a correlation set, identifying parts of the outbound message that uniquely identify our instance and matching them with parts of the inbound message to make the correlation.
  2. We can use a Request-Reply JMS adapter which by default expects the response to contain a JMSCorrelationID equal to the outgoing JMSMessageID.  Although no configuration is required for this on the SOA client side, the service needs to copy the incoming JMSMessageID to the outgoing JMSCorrelationID.
Special Case - Request-Reply Synchronous JMS Adapter

When using a synchronous Request-Reply JMS adapter we can omit to specify the message selector because the Request-Reply JMS adapter will immediately do a listen with a message selector for the correlation ID rather than processing the incoming message asynchronously.
The synchronous request-reply will block the BPEL process thread and hold open the BPEL transaction until a response is received, so this should only be used when you expect the request to be completed in a few seconds.

The JCA Connection Factory used must point to a non-XA JMS Connection Factory and must have the isTransacted property set to “false”.  See the documentation for more details.

Sample

I developed a JDeveloper SOA project that demonstrates using a single queue for multiple incoming adapters.  The overall process flow is shown in the picture below.  The BPEL process on the left receives messages from the jms/TestQueue2 and sends messages to the jms/Test Queue1.  A Mediator is used to simulate multiple services and also provide a web interface to initiate the process.  The correct adapter is identified by using JMS message properties and a selector.

 

The flow above shows that the process is initiated from EM using a web service binding on mediator.  The mediator, acting as a client, posts the request to the inbound queue with a JMSType property set to "Initiate". ModelClientBPELServiceInbound RequestClient receives web service request and posts the request to the inbound queue with JMSType='Initiate'The JMS adapter with a message selector "JMSType='Initiate'" receives the message and causes a composite to be created.  The composite in turn causes the BPEL process to start executing.
The BPEL process then sends a request to Service 1 on the outbound queue.
Key Points

  • Initiate message can be used to initate a correlation set if necessary
  • Selector required to distinguish initiate messages from other messages on the queue
Service 1 receives the request and sends a response on the inbound queue with JMSType='Service1' and JMSCorrelationID= incoming JMS Message ID.Separate Request and Reply Adapters The JMS adapter with a message selector "JMSType='Service1'" receives the message and causes a composite to be created.  The composite uses a correlation set to in turn deliver the message to BPEL which correlates it with the existing BPEL process.
The BPEL process then sends a request to Service 2 on the outbound queue.
Key Points
  • Separate request & reply adapters require a correlation set to ensure that reply goes to correct BPEL process instance
  • Selector required to distinguish service 1 response messages from other messages on the queue
Service 2 receives the request and sends a response on the inbound queue with JMSType='Service2' and JMSCorrelationID= incoming JMS Message ID.Asynchronous Request-Reply Adapter The JMS adapter with a message selector "JMSType='Service2'" receives the message and causes a composite to be created.  The composite in turn delivers the message to the existing BPEL process using native JMS correlation.
Key Point
  • Asynchronous request-reply adapter does not require a correlation set, JMS adapter auto-correlates using CorrelationID to ensure that reply goes to correct BPEL process instance
  • Selector still required to distinguish service 2 response messages from other messages on the queue
The BPEL process then sends a request to Service 3 on the outbound queue using a synchronous request-reply.
Service 3 receives the request and sends a response on the inbound queue with JMSType='Service2' and JMSCorrelationID= incoming JMS Message ID.Synchronous Request-Reply Adapter The synchronous JMS adapter receives the response without a message selector and correlates it to the BPEL process using native JMS correlation and sends the overall response to the outbound queue.
Key Points
  • Synchronous request-reply adapter does not require a correlation set, JMS adapter auto-correlates using CorrelationID to ensure that reply goes to correct BPEL process instance
  • Selector also not required to distinguish service 3 response messages from other messages on the queue because the synchronous adapter is doing a selection on the expected CorrelationID
 Outbound ResponseClient receives the response on an outbound queue.   Summary

When using a single JMS queue for multiple purposes bear in mind the following:

  • If multiple receives use the same queue then you need to have a message selector.  The corollary to this is that the message sender must add a JMS property to the message that can be used in the message selector.
  • When using a request-reply JMS adapter then there is no need for a correlation set, correlation is done in the adapter by matching the outbound JMS message ID to the inbound JMS correlation ID.  The corollary to this is that the message sender must copy the JMS request message ID to the JMS response correlation ID.
  • When using a synchronous request-reply JMS adapter then there is no need for the message selector because the message selection is done based on the JMS correlation ID.
  • Synchronous request-reply adapter requires a non-XA connection factory to be used so that the request part of the interaction can be committed separately to the receive part of the interaction.
  • Synchronous request-reply JMS adapter should only be used when the reply is expected to take just a few seconds.  If the reply is expected to take longer then the asynchronous request-reply JMS adapter should be used.
Deploying the Sample

The sample is available to download here and makes use of the following JMS resources:

JNDIResource;Notesjms/TestQueueQueueOutbound queue from the BPEL processjms/TestQueue2QueueInbound queue to the BPEL processeis/wls/TestQueueJMS Adapter Connector FactoryThis can point to an XA or non-XA JMS Connection Factory such as weblogic.jms.XAConnectionFactoryeis/wls/TestQueueNone-XA JMS Adapter Connector FactoryThis must point to a non-XA JMS Connection Factory such as weblogic.jms.ConnectionFactory and must have isTransacted set to “false”

To run the sample then just use the test facility in the EM console or the soa-infra application.

One Queue to Rule them All

Fri, 2014-03-28 16:16
Using a Single Queue for Multiple Message Types with SOA Suite Problem StatementYou use a single JMS queue for sending multiple message types /  service requests.  You use a single JMS queue for receiving multiple message types / service requests.  You have multiple SOA JMS Adapter interfaces for reading and writing these queues.  In a composite it is random which interface gets a message from the JMS queue.  It is not a problem having multiple adapter instances writing to a single queue, the problem is only with having multiple readers because each reader gets the first message on the queue. Background

The JMS Adapter is unaware of who receives the messages.  Each adapter instance just takes the message from the queue and delivers it to its own configured interface, one interface per adapter instance.  The SOA infrastructure is then responsible for routing that message, usually via a database table and an in memory notification message, to a component within a composite.  Each message will create a new composite but the BPEL engine and Mediator engine will attempt to match callback messages to the appropriate Mediator or BPEL instance.
Note that message type, including XML document type, has nothing to do with the preceding statements.

The net result is that if you have a sequence of two receives from the same queue using different adapters then the messages will be split equally between the two adapters, meaning that half the time the wrong adapter will receive the message.  This blog entry looks at how to resolve this issue.

Note that the same problem occurs whenever you have more than 1 adapter listening to the same queue, whether they are in the same composite or different composites.  The solution in this blog entry is also relevant to this use case.

SolutionsIn order to correctly deliver the messages to the correct interface we need to identify the interface they should be delivered to.  This can be done by using JMS properties.  For example the JMSType property can be used to identify the type of the message.  A message selector can be added to the JMS inbound adapter that will cause the adapter to filter out messages intended for other interfaces.  For example if we need to call three services that are implemented in a single application:
  • Service 1 receives messages on the single outbound queue from SOA, it send responses back on the single inbound queue.
  • Similarly Service 2 and Service 3 also receive messages on the single outbound queue from SOA, they send responses back on the single inbound queue.
First we need to ensure the messages are delivered to the correct adapter instance.  This is achieved as follows:
  • aThe inbound JMS adapter is configured with a JMS message selector.  The message selector might be "JMSType='Service1'" for responses from Service 1.  Similarly the selector would be "JMSType='Service2'" for the adapter waiting on a response from Service 2.  The message selector ensures that each adapter instance will retrieve the first message from the queue that matches its selector.
  • The sending service needs to set the JMS property (JMSType in our example) that is used in the message selector.
Now our messages are being delivered to the correct interface we need to make sure that they get delivered to the correct Mediator or BPEL instance.  We do this with correlation.  There are several correlation options:
  1. We can do manual correlation with a correlation set, identifying parts of the outbound message that uniquely identify our instance and matching them with parts of the inbound message to make the correlation.
  2. We can use a Request-Reply JMS adapter which by default expects the response to contain a JMSCorrelationID equal to the outgoing JMSMessageID.  Although no configuration is required for this on the SOA client side, the service needs to copy the incoming JMSMessageID to the outgoing JMSCorrelationID.
Special Case - Request-Reply Synchronous JMS Adapter

When using a synchronous Request-Reply JMS adapter we can omit to specify the message selector because the Request-Reply JMS adapter will immediately do a listen with a message selector for the correlation ID rather than processing the incoming message asynchronously.
The synchronous request-reply will block the BPEL process thread and hold open the BPEL transaction until a response is received, so this should only be used when you expect the request to be completed in a few seconds.

The JCA Connection Factory used must point to a non-XA JMS Connection Factory and must have the isTransacted property set to “false”.  See the documentation for more details.

Sample

I developed a JDeveloper SOA project that demonstrates using a single queue for multiple incoming adapters.  The overall process flow is shown in the picture below.  The BPEL process on the left receives messages from the jms/TestQueue2 and sends messages to the jms/Test Queue1.  A Mediator is used to simulate multiple services and also provide a web interface to initiate the process.  The correct adapter is identified by using JMS message properties and a selector.

 

The flow above shows that the process is initiated from EM using a web service binding on mediator.  The mediator, acting as a client, posts the request to the inbound queue with a JMSType property set to "Initiate". Model Client BPEL Service Inbound Request Client receives web service request and posts the request to the inbound queue with JMSType='Initiate' The JMS adapter with a message selector "JMSType='Initiate'" receives the message and causes a composite to be created.  The composite in turn causes the BPEL process to start executing.
The BPEL process then sends a request to Service 1 on the outbound queue.
Key Points

  • Initiate message can be used to initate a correlation set if necessary
  • Selector required to distinguish initiate messages from other messages on the queue
Service 1 receives the request and sends a response on the inbound queue with JMSType='Service1' and JMSCorrelationID= incoming JMS Message ID. Separate Request and Reply Adapters   The JMS adapter with a message selector "JMSType='Service1'" receives the message and causes a composite to be created.  The composite uses a correlation set to in turn deliver the message to BPEL which correlates it with the existing BPEL process.
The BPEL process then sends a request to Service 2 on the outbound queue.
Key Points
  • Separate request & reply adapters require a correlation set to ensure that reply goes to correct BPEL process instance
  • Selector required to distinguish service 1 response messages from other messages on the queue
Service 2 receives the request and sends a response on the inbound queue with JMSType='Service2' and JMSCorrelationID= incoming JMS Message ID. Asynchronous Request-Reply Adapter   The JMS adapter with a message selector "JMSType='Service2'" receives the message and causes a composite to be created.  The composite in turn delivers the message to the existing BPEL process using native JMS correlation.
Key Point
  • Asynchronous request-reply adapter does not require a correlation set, JMS adapter auto-correlates using CorrelationID to ensure that reply goes to correct BPEL process instance
  • Selector still required to distinguish service 2 response messages from other messages on the queue
The BPEL process then sends a request to Service 3 on the outbound queue using a synchronous request-reply.
Service 3 receives the request and sends a response on the inbound queue with JMSType='Service2' and JMSCorrelationID= incoming JMS Message ID. Synchronous Request-Reply Adapter   The synchronous JMS adapter receives the response without a message selector and correlates it to the BPEL process using native JMS correlation and sends the overall response to the outbound queue.
Key Points
  • Synchronous request-reply adapter does not require a correlation set, JMS adapter auto-correlates using CorrelationID to ensure that reply goes to correct BPEL process instance
  • Selector also not required to distinguish service 3 response messages from other messages on the queue because the synchronous adapter is doing a selection on the expected CorrelationID
  Outbound Response Client receives the response on an outbound queue.       Summary

When using a single JMS queue for multiple purposes bear in mind the following:

  • If multiple receives use the same queue then you need to have a message selector.  The corollary to this is that the message sender must add a JMS property to the message that can be used in the message selector.
  • When using a request-reply JMS adapter then there is no need for a correlation set, correlation is done in the adapter by matching the outbound JMS message ID to the inbound JMS correlation ID.  The corollary to this is that the message sender must copy the JMS request message ID to the JMS response correlation ID.
  • When using a synchronous request-reply JMS adapter then there is no need for the message selector because the message selection is done based on the JMS correlation ID.
  • Synchronous request-reply adapter requires a non-XA connection factory to be used so that the request part of the interaction can be committed separately to the receive part of the interaction.
  • Synchronous request-reply JMS adapter should only be used when the reply is expected to take just a few seconds.  If the reply is expected to take longer then the asynchronous request-reply JMS adapter should be used.
Deploying the Sample

The sample is available to download here and makes use of the following JMS resources:

JNDI Resource; Notes jms/TestQueue Queue Outbound queue from the BPEL process jms/TestQueue2 Queue Inbound queue to the BPEL process eis/wls/TestQueue JMS Adapter Connector Factory This can point to an XA or non-XA JMS Connection Factory such as weblogic.jms.XAConnectionFactory eis/wls/TestQueue None-XA JMS Adapter Connector Factory This must point to a non-XA JMS Connection Factory such as weblogic.jms.ConnectionFactory and must have isTransacted set to “false”

To run the sample then just use the test facility in the EM console or the soa-infra application.

Not Just a Cache

Thu, 2014-03-27 22:23
Coherence as a Compute Grid

Coherence is best known as a data grid, providing distributed caching with an ability to move processing to the data in the grid.  Less well known is the fact that Coherence also has the ability to function as a compute grid, distributing work across multiple servers in a cluster.  In this entry, which was co-written with my colleague Utkarsh Nadkarni, we will look at using Coherence as a compute grid through the use of the Work Manager API and compare it to manipulating data directly in the grid using Entry Processors.

Coherence Distributed Computing Options

The Coherence documentation identifies several methods for distributing work across the cluster, see Processing Data in a Cache.  They can be summarized as:

  • Entry Processors
    • An InvocableMap interface, inherited by the NamedCache interface, provides support for executing an agent (EntryProcessor or EntryAggregator) on individual entries within the cache.
    • The entries may or may not exist, either way the agent is executed once for each key provided, or if no key is provided then it is executed once for each object in the cache.
    • In Enterprise and Grid editions of Coherence the entry processors are executed on the primary cache nodes holding the cached entries.
    • Agents can return results.
    • One agent executes multiple times per cache node, once for each key targeted on the node.
  • Invocation Service
    • An InvocationService provides support for executing an agent on one or more nodes within the grid.
    • Execution may be targeted at specific nodes or at all nodes running the Invocation Service.
    • Agents can return results.
    • One agent executes once per node.
  • Work Managers
    • A WorkManager class provides a grid aware implementation of the commonJ WorkManager which can be used to run tasks across multiple threads on multiple nodes within the grid.
    • WorkManagers run on multiple nodes.
    • Each WorkManager may have multiple threads.
    • Tasks implement the Work interface and are assigned to specific WorkManager threads to execute.
    • Each task is executed once.
Three Models of Distributed Computation

The previous section listing the distributed computing options in Coherence shows that there are 3 distinct execution models:

  • Per Cache Entry Execution (Entry Processor)
    • Execute the agent on the entry corresponding to a cache key.
    • Entries processed on a single thread per node.
    • Parallelism across nodes.
  • Per Node Execution (Invocation Service)
    • Execute the same agent once per node.
    • Agent processed on a single thread per node.
    • Parallelism across nodes.
  • Per Task Execution (Work Manager)
    • Each task executed once.
    • Parallelism across nodes and across threads within a node.

The entry processor is good for operating on individual cache entries.  It is not so good for working on groups of cache entries.

The invocation service is good for performing checks on a node, but is limited in its parallelism.

The work manager is good for operating on groups of related entries in the cache or performing non-cache related work in parallel.  It has a high degree of parallelism.

As you can see the primary choice for distributed computing comes down to the Work Manager and the Entry Processor.

Differences between using Entry Processors and Work Managers in CoherenceAspectEntry ProcessorsWork ManagersDegree of parallelizationIs a function of the number of Coherence nodes. EntryProcessors are run concurrently across all nodes in a cluster. However, within each node only one instance of the entry processor executes at a time.Is a function of the number of Work Manager threads. The Work is run concurrently across all threads in all Work Manager instances.TransactionalityTransactional. If an EntryProcessor running on one node does not complete (say, due to that node crashing), the entries targeted will be executed by an EntryProcessor on another node.Not transactional. The specification does not explicitly specify what the response should be if a remote server crashes during an execution. Current implementation uses WORK_COMPLETED with WorkCompletedException as a result. In case a Work does not run to completion, it is the responsibility of the client to resubmit the Work to the Work Manager. How is the Cache accessed or mutated?Operations against the cache contents are executed by (and thus within the localized context of) a cache.Accesses and changes to the cache are done directly through the cache API.Where is the processing performed?In the same JVM where the entries-to-be-processed reside.In the Work Manager server. This may not be the same JVM where the entries-to-be-processed reside.Network TrafficIs a function of the size of the EntryProcessor. Typically, the size of an EntryProcessor is much smaller than the size of the data transferred across nodes in the case of a Work Manager approach. This makes the EntryProcessor approach more network-efficient and hence more scalable. One EntryProcessor is transmitted to each cache node.Is a function of the
  • Number of Work Objects, of which multiple may be sent to each server.
  • Size of the data set transferred from the Backing Map to the Work Manager Server.
Distribution of “Tasks”Tasks are moved to the location at which the entries-to-be-processed are being managed. This may result in a random distribution of tasks. The distribution tends to get equitable as the number of entries increases.Tasks are distributed equally across the threads in the Work Manager Instances.Implementation of the EntryProcessor or Work class.Create a class that extends AbstractProcessor. Implement the process method. Update the cache item based on the key passed in to the process method.Create a class that is serializable and implements commonj.work.Work. Implement the run method.Implementation of “Task”In the process method, update the cache item based on the key passed into the process method.In the run method, do the following:
  • Get a reference to the named cache
  • Do the Work – Get a reference to the Cache Item; change the cache item; put the cache item back into the named cache.
Completion NotificationWhen the NamedCache.invoke method completes then all the entry processors have completed executing.When a task is submitted for execution it executes asynchronously on the work manager threads in the cluster.  Status may be obtained by registering a commonj.work.WorkListener class when calling the WorkManager.schedule method.  This will provide updates when the Work is accepted, started and completed or rejected.  Alternatively the WorkManager.waitForAll and WorkManager.waitForAny methods allow blocking waits for either all or one result respectively.Returned Resultsjava.lang.Object – when executed on one cache item. This returns result of the invocation as returned from the EntryProcessor.
java.util.Map – when executed on a collection of keys. This returns a Map containing the results of invoking the EntryProcessor against each of the specified keys. commonj.work.WorkItem - There are three possible outcomes
  • The Work is not yet complete. In this case, a null is returned by WorkItem.getResult.
  • The Work started but completed with an exception. This may have happened due to a Work Manager Instance terminating abruptly. This is indicated by an exception thrown by WorkItem.getResult.
  • The Work Manager instance indicated that the Work is complete and the Work ran to completion. In this case, WorkItem.getResult returns a non-null and no exception is thrown by WorkItem.getResult.
Error HandlingFailure of a node results in all the work assigned to that node being executed on the new primary. This may result in some work being executed twice, but Coherence ensures that the cache is only updated once per item.Failure of a node results in the loss of scheduled tasks assigned to that node. Completed tasks are sent back to the client as they complete.Fault Handling Extension

Entry processors have excellent error handling within Coherence.  Work Managers less so.  In order to provide resiliency on node failure I implemented a “RetryWorkManager” class that detects tasks that have failed to complete successfully and resubmits them to the grid for another attempt.

A JDeveloper project with the RetryWorkManager is available for download here.  It includes sample code to run a simple task across multiple work manager threads.

To create a new RetryWorkManager that will retry failed work twice then you would use this: WorkManager = new RetryWorkManager("WorkManagerName", 2);  // Change for number of retries, if no retry count is provided then the default is 0.You can control the number of retries at the individual work level as shown below: WorkItem workItem = schedule(work); // Use number of retries set at WorkManager creation
WorkItem workItem = schedule(work, workListener); // Use number of retries set at WorkManager creation
WorkItem workItem = schedule(work, 4); // Change number of retries
WorkItem workItem = schedule(work, workListener, 4); // Change number of retriesCurrently the RetryWorkManager defaults to having 0 threads.  To change use this constructor: WorkItem workItem = schedule(work, workListener, 3, 4); // Change number of threads (3) and retries (4)Note that none of this sample code is supported by Oracle in any way, and is provided purely as a sample of what can be done with Coherence. How the RetryWorkManager Works

The RetryWorkManager delegates most operations to a Coherence WorkManager instance.  It creates a WorkManagerListener to intercept status updates.  On receiving a WORK_COMPLETED callback the listener checks the result to see if the completion is due to an error.  If an error occurred and there are retries left then the work is resubmitted.  The WorkItem returned by scheduling an event is wrapped in a RetryWorkItem.  This RetryWorkItem is updated with a new Coherence WorkItem when the task is retried.  If the client registers a WorkManagerListener then the RetryWorkManagerListener delegates non-retriable events to the client listener.  Finally the waitForAll and waitForAny methods are modified to deal with work items being resubmitted in the event of failure.

Sample Code for EntryProcessor and RetryWorkManager

The downloadable project contains sample code for running the work manager and an entry processor.

The demo implements a 3-tier architecture

  1. Coherence Cache Servers
    • Can be started by running RunCacheServer.cmd
    • Runs a distributed cache used by the Task to be executed in the grid
  2. Coherence Work Manager Servers
    • Can be started by running RunWorkManagerServer.cmd
    • Takes no parameters
    • Runs two threads for executing tasks
  3. Coherence Work Manager Clients
    • Can be started by running RunWorkManagerClient.cmd
    • Takes three parameters currently
      • Work Manager name - should be "AntonyWork" - default is "AntonyWork"
      • Number of tasks to schedule - default is 10
      • Time to wait for tasks to complete in seconds - default is 60

The task stores the number of times it has been executed in the cache, so multiple runs will see the counter incrementing.  The choice between EntryProcessor and WorkManager is controlled by changing the value of USE_ENTRY_PROCESSOR between false and true in the RunWorkManagerClient.cmd script.

The SetWorkManagerEnv.cmd script should be edited to point to the Coherence home directory and the Java home directory.

Summary

If you need to perform operations on cache entries and don’t need to have cross-checks between the entries then the best solution is to use an entry processor.  The entry processor is fault tolerant and updates to the cached entity will be performed once only.

If you need to perform generic work that may need to touch multiple related cache entries then the work manager may be a better solution.  The extensions I created in the RetryWorkManager provide a degree of resiliency to deal with node failure without impacting the client.

The RetryWorkManager can be downloaded here.

Not Just a Cache

Thu, 2014-03-27 22:23
Coherence as a Compute Grid

Coherence is best known as a data grid, providing distributed caching with an ability to move processing to the data in the grid.  Less well known is the fact that Coherence also has the ability to function as a compute grid, distributing work across multiple servers in a cluster.  In this entry, which was co-written with my colleague Utkarsh Nadkarni, we will look at using Coherence as a compute grid through the use of the Work Manager API and compare it to manipulating data directly in the grid using Entry Processors.

Coherence Distributed Computing Options

The Coherence documentation identifies several methods for distributing work across the cluster, see Processing Data in a Cache.  They can be summarized as:

  • Entry Processors
    • An InvocableMap interface, inherited by the NamedCache interface, provides support for executing an agent (EntryProcessor or EntryAggregator) on individual entries within the cache.
    • The entries may or may not exist, either way the agent is executed once for each key provided, or if no key is provided then it is executed once for each object in the cache.
    • In Enterprise and Grid editions of Coherence the entry processors are executed on the primary cache nodes holding the cached entries.
    • Agents can return results.
    • One agent executes multiple times per cache node, once for each key targeted on the node.
  • Invocation Service
    • An InvocationService provides support for executing an agent on one or more nodes within the grid.
    • Execution may be targeted at specific nodes or at all nodes running the Invocation Service.
    • Agents can return results.
    • One agent executes once per node.
  • Work Managers
    • A WorkManager class provides a grid aware implementation of the commonJ WorkManager which can be used to run tasks across multiple threads on multiple nodes within the grid.
    • WorkManagers run on multiple nodes.
    • Each WorkManager may have multiple threads.
    • Tasks implement the Work interface and are assigned to specific WorkManager threads to execute.
    • Each task is executed once.
Three Models of Distributed Computation

The previous section listing the distributed computing options in Coherence shows that there are 3 distinct execution models:

  • Per Cache Entry Execution (Entry Processor)
    • Execute the agent on the entry corresponding to a cache key.
    • Entries processed on a single thread per node.
    • Parallelism across nodes.
  • Per Node Execution (Invocation Service)
    • Execute the same agent once per node.
    • Agent processed on a single thread per node.
    • Parallelism across nodes.
  • Per Task Execution (Work Manager)
    • Each task executed once.
    • Parallelism across nodes and across threads within a node.

The entry processor is good for operating on individual cache entries.  It is not so good for working on groups of cache entries.

The invocation service is good for performing checks on a node, but is limited in its parallelism.

The work manager is good for operating on groups of related entries in the cache or performing non-cache related work in parallel.  It has a high degree of parallelism.

As you can see the primary choice for distributed computing comes down to the Work Manager and the Entry Processor.

Differences between using Entry Processors and Work Managers in Coherence Aspect Entry Processors Work Managers Degree of parallelization Is a function of the number of Coherence nodes. EntryProcessors are run concurrently across all nodes in a cluster. However, within each node only one instance of the entry processor executes at a time. Is a function of the number of Work Manager threads. The Work is run concurrently across all threads in all Work Manager instances. Transactionality Transactional. If an EntryProcessor running on one node does not complete (say, due to that node crashing), the entries targeted will be executed by an EntryProcessor on another node. Not transactional. The specification does not explicitly specify what the response should be if a remote server crashes during an execution. Current implementation uses WORK_COMPLETED with WorkCompletedException as a result. In case a Work does not run to completion, it is the responsibility of the client to resubmit the Work to the Work Manager. How is the Cache accessed or mutated? Operations against the cache contents are executed by (and thus within the localized context of) a cache. Accesses and changes to the cache are done directly through the cache API. Where is the processing performed? In the same JVM where the entries-to-be-processed reside. In the Work Manager server. This may not be the same JVM where the entries-to-be-processed reside. Network Traffic Is a function of the size of the EntryProcessor. Typically, the size of an EntryProcessor is much smaller than the size of the data transferred across nodes in the case of a Work Manager approach. This makes the EntryProcessor approach more network-efficient and hence more scalable. One EntryProcessor is transmitted to each cache node. Is a function of the
  • Number of Work Objects, of which multiple may be sent to each server.
  • Size of the data set transferred from the Backing Map to the Work Manager Server.
Distribution of “Tasks” Tasks are moved to the location at which the entries-to-be-processed are being managed. This may result in a random distribution of tasks. The distribution tends to get equitable as the number of entries increases. Tasks are distributed equally across the threads in the Work Manager Instances. Implementation of the EntryProcessor or Work class. Create a class that extends AbstractProcessor. Implement the process method. Update the cache item based on the key passed in to the process method. Create a class that is serializable and implements commonj.work.Work. Implement the run method. Implementation of “Task” In the process method, update the cache item based on the key passed into the process method. In the run method, do the following:
  • Get a reference to the named cache
  • Do the Work – Get a reference to the Cache Item; change the cache item; put the cache item back into the named cache.
Completion Notification When the NamedCache.invoke method completes then all the entry processors have completed executing. When a task is submitted for execution it executes asynchronously on the work manager threads in the cluster.  Status may be obtained by registering a commonj.work.WorkListener class when calling the WorkManager.schedule method.  This will provide updates when the Work is accepted, started and completed or rejected.  Alternatively the WorkManager.waitForAll and WorkManager.waitForAny methods allow blocking waits for either all or one result respectively. Returned Results java.lang.Object – when executed on one cache item. This returns result of the invocation as returned from the EntryProcessor.
java.util.Map – when executed on a collection of keys. This returns a Map containing the results of invoking the EntryProcessor against each of the specified keys. commonj.work.WorkItem - There are three possible outcomes
  • The Work is not yet complete. In this case, a null is returned by WorkItem.getResult.
  • The Work started but completed with an exception. This may have happened due to a Work Manager Instance terminating abruptly. This is indicated by an exception thrown by WorkItem.getResult.
  • The Work Manager instance indicated that the Work is complete and the Work ran to completion. In this case, WorkItem.getResult returns a non-null and no exception is thrown by WorkItem.getResult.
Error Handling Failure of a node results in all the work assigned to that node being executed on the new primary. This may result in some work being executed twice, but Coherence ensures that the cache is only updated once per item. Failure of a node results in the loss of scheduled tasks assigned to that node. Completed tasks are sent back to the client as they complete. Fault Handling Extension

Entry processors have excellent error handling within Coherence.  Work Managers less so.  In order to provide resiliency on node failure I implemented a “RetryWorkManager” class that detects tasks that have failed to complete successfully and resubmits them to the grid for another attempt.

A JDeveloper project with the RetryWorkManager is available for download here.  It includes sample code to run a simple task across multiple work manager threads.

To create a new RetryWorkManager that will retry failed work twice then you would use this: WorkManager = new RetryWorkManager("WorkManagerName", 2);  // Change for number of retries, if no retry count is provided then the default is 0.You can control the number of retries at the individual work level as shown below: WorkItem workItem = schedule(work); // Use number of retries set at WorkManager creation
WorkItem workItem = schedule(work, workListener); // Use number of retries set at WorkManager creation
WorkItem workItem = schedule(work, 4); // Change number of retries
WorkItem workItem = schedule(work, workListener, 4); // Change number of retriesCurrently the RetryWorkManager defaults to having 0 threads.  To change use this constructor: WorkItem workItem = schedule(work, workListener, 3, 4); // Change number of threads (3) and retries (4)Note that none of this sample code is supported by Oracle in any way, and is provided purely as a sample of what can be done with Coherence. How the RetryWorkManager Works

The RetryWorkManager delegates most operations to a Coherence WorkManager instance.  It creates a WorkManagerListener to intercept status updates.  On receiving a WORK_COMPLETED callback the listener checks the result to see if the completion is due to an error.  If an error occurred and there are retries left then the work is resubmitted.  The WorkItem returned by scheduling an event is wrapped in a RetryWorkItem.  This RetryWorkItem is updated with a new Coherence WorkItem when the task is retried.  If the client registers a WorkManagerListener then the RetryWorkManagerListener delegates non-retriable events to the client listener.  Finally the waitForAll and waitForAny methods are modified to deal with work items being resubmitted in the event of failure.

Sample Code for EntryProcessor and RetryWorkManager

The downloadable project contains sample code for running the work manager and an entry processor.

The demo implements a 3-tier architecture

  1. Coherence Cache Servers
    • Can be started by running RunCacheServer.cmd
    • Runs a distributed cache used by the Task to be executed in the grid
  2. Coherence Work Manager Servers
    • Can be started by running RunWorkManagerServer.cmd
    • Takes no parameters
    • Runs two threads for executing tasks
  3. Coherence Work Manager Clients
    • Can be started by running RunWorkManagerClient.cmd
    • Takes three parameters currently
      • Work Manager name - should be "AntonyWork" - default is "AntonyWork"
      • Number of tasks to schedule - default is 10
      • Time to wait for tasks to complete in seconds - default is 60

The task stores the number of times it has been executed in the cache, so multiple runs will see the counter incrementing.  The choice between EntryProcessor and WorkManager is controlled by changing the value of USE_ENTRY_PROCESSOR between false and true in the RunWorkManagerClient.cmd script.

The SetWorkManagerEnv.cmd script should be edited to point to the Coherence home directory and the Java home directory.

Summary

If you need to perform operations on cache entries and don’t need to have cross-checks between the entries then the best solution is to use an entry processor.  The entry processor is fault tolerant and updates to the cached entity will be performed once only.

If you need to perform generic work that may need to touch multiple related cache entries then the work manager may be a better solution.  The extensions I created in the RetryWorkManager provide a degree of resiliency to deal with node failure without impacting the client.

The RetryWorkManager can be downloaded here.

Packt Publishing Buy One Get One Free Offer

Thu, 2014-03-20 14:35
Packt Publishing celebrates their 2000th title with a Buy One Get One Free Offer

Great time to get those Packt books you’ve been thinking of buying, like the SOA Suite 11g Developers Guide or the SOA Suite 11g Developers Cookbook.

Packt Publishing Buy One Get One Free Offer

Thu, 2014-03-20 14:35
Packt Publishing celebrates their 2000th title with a Buy One Get One Free Offer

Great time to get those Packt books you’ve been thinking of buying, like the SOA Suite 11g Developers Guide or the SOA Suite 11g Developers Cookbook.

The Impact of Change

Sun, 2014-03-09 16:01
Measuring Impact of Change in SOA Suite
Mormon prophet Thomas S. Monson once said:

When performance is measured, performance improves. When performance is measured and reported, the rate of performance accelerates.

(LDS Conference Report, October 1970, p107)

Like everything in life, a SOA Suite installation that is monitored and tracked has a much better chance of performing well than one that is not measured.  With that in mind I came up with tool to allow the measurement of the impact of configuration changes on database usage in SOA Suite.  This tool can be used to assess the impact of different configurations on both database growth and database performance, helping to decide which optimizations offer real benefit to the composite under test.

Basic Approach

The basic approach of the tool is to take a snapshot of the number of rows in the SOA tables before executing a composite.  The composite is then executed.  After the composite has completed another snapshot is taken of the SOA tables.  This is illustrated in the diagram below:

An example of the data collected by the tool is shown below:

Test NameTotal Tables ChangedTotal Rows AddedNotesAsyncTest11315Async Interaction with simple SOA composite, one retry to send response.AsyncTest21213Async interaction with simple SOA composite, no retries on sending response.AsyncTest31213Async interaction with simple SOA composite, no callback address provided.OneWayTest11213One-Way interaction with simple SOA composite.SyncTest177Sync interaction with simple SOA composite.

Note that the first three columns are provided by the tool, the fourth column is just an aide-memoir to identify what the test name actually did. The tool also allows us to drill into the data to get a better look at what is actually changing as shown in the table below:

Test NameTable NameRows AddedAsyncTest1AUDIT_COUNTER1AsyncTest1AUDIT_DETAILS1AsyncTest1AUDIT_TRAIL2AsyncTest1COMPOSITE_INSTANCE1AsyncTest1CUBE_INSTANCE1AsyncTest1CUBE_SCOPE1AsyncTest1DLV_MESSAGE1AsyncTest1DOCUMENT_CI_REF1AsyncTest1DOCUMENT_DLV_MSG_REF1AsyncTest1HEADERS_PROPERTIES1AsyncTest1INSTANCE_PAYLOAD1AsyncTest1WORK_ITEM1AsyncTest1XML_DOCUMENT2

Here we have drilled into the test case with the retry of the callback to see what tables are actually being written to.

Finally we can compare two tests to see difference in the number of rows written and the tables updated as shown below:

Test NameBase Test NameTable NameRow DifferenceAsyncTest1AsyncTest2AUDIT_TRAIL1

Here are the additional tables referenced by this test

Test NameBase Test NameAdditional Table NameRows AddedAsyncTest1AsyncTest2WORK_ROWS1How it Works

I created a database stored procedure, soa_snapshot.take_soa_snaphot(test_name, phase). that queries all the SOA tables and records the number of rows in each table.  By running the stored procedure before and after the execution of a composite we can capture the number of rows in the SOA database before and after a composite executes.  I then created a view that shows the difference in the number of rows before and after composite execution.  This view has a number of sub-views that allow us to query specific items.  The schema is shown below:

The different tables and views are:

  • CHANGE_TABLE
    • Used to track number of rows in SOA schema, each test case has two or more phases.  Usually phase 1 is before execution and phase 2 is after execution.
    • This only used by the stored procedure and the views.
  • DELTA_VIEW
    • Used to track changes in number of rows in SOA database between phases of a test case.  This is a view on CHANGE_TABLE.  All other views are based off this view.
  • SIMPLE_DELTA_VIEW
    • Provides number of rows changed in each table.
  • SUMMARY_DELTA_VIEW
    • Provides a summary of total rows and tables changed.
  • DIFFERENT_ROWS_VIEW
    • Provides a summary of differences in rows updated between test cases
  • EXTRA_TABLES_VIEW
    • Provides a summary of the extra tables and rows used by a test case.
    • This view makes use of a session context, soa_ctx, which holds the test case name and the baseline test case name.  This context is initialized by calling the stored procedure soa_ctx_pkg.set(testCase, baseTestCase).

I created a web service wrapper to the take_soa_snapshot procedure so that I could use SoapUI to perform the tests.

Sample OutputHow many rows and tables did a particular test use?

Here we can see how many rows in how many tables changed as a result of running a test:

-- Display the total number of rows and tables changed for each test
select * from summary_delta_view
order by test_name;

TEST_NAME            TOTALDELTAROWS TOTALDELTASIZE TOTALTABLES
-------------------- -------------- -------------- -----------
AsyncTest1                   15              0          13
AsyncTest1noCCIS             15              0          13
AsyncTest1off                 8              0           8
AsyncTest1prod               13              0          12
AsyncTest2                   13              0          12
AsyncTest2noCCIS             13              0          12
AsyncTest2off                 7              0           7
AsyncTest2prod               11              0          11
AsyncTest3                   13              0          12
AsyncTest3noCCIS             13          65536          12
AsyncTest3off                 7              0           7
AsyncTest3prod               11              0          11
OneWayTest1                  13              0          12
OneWayTest1noCCI             13          65536          12
OneWayTest1off                7              0           7
OneWayTest1prod              11              0          11
SyncTest1                     7              0           7
SyncTest1noCCIS               7              0           7
SyncTest1off                  2              0           2
SyncTest1prod                 5              0           5

20 rows selected

Which tables grew during a test?

Here for a given test we can see which tables had rows inserted.

-- Display the tables which grew and show the number of rows they grew by
select * from simple_delta_view
where test_name='AsyncTest1'
order by table_name;
TEST_NAME            TABLE_NAME                      DELTAROWS  DELTASIZE
-------------------- ------------------------------ ---------- ----------
AsyncTest1       AUDIT_COUNTER                           1          0
AsyncTest1       AUDIT_DETAILS                           1          0
AsyncTest1       AUDIT_TRAIL                             2          0
AsyncTest1       COMPOSITE_INSTANCE                      1          0
AsyncTest1       CUBE_INSTANCE                           1          0
AsyncTest1       CUBE_SCOPE                              1          0
AsyncTest1       DLV_MESSAGE                             1          0
AsyncTest1       DOCUMENT_CI_REF                         1          0
AsyncTest1       DOCUMENT_DLV_MSG_REF                    1          0
AsyncTest1       HEADERS_PROPERTIES                      1          0
AsyncTest1       INSTANCE_PAYLOAD                        1          0
AsyncTest1       WORK_ITEM                               1          0
AsyncTest1       XML_DOCUMENT                            2          0
13 rows selected

Which tables grew more in test1 than in test2?

Here we can see the differences in rows for two tests.

-- Return difference in rows updated (test1)
select * from different_rows_view
where test1='AsyncTest1' and test2='AsyncTest2';

TEST1                TEST2                TABLE_NAME                          DELTA
-------------------- -------------------- ------------------------------ ----------
AsyncTest1       AsyncTest2       AUDIT_TRAIL                             1

Which tables were used by test1 but not by test2?

Here we can see tables that were used by one test but not by the other test.

-- Register base test case for use in extra_tables_view
-- First parameter (test1) is test we expect to have extra rows/tables
begin soa_ctx_pkg.set('AsyncTest1', 'AsyncTest2'); end;
/
anonymous block completed
-- Return additional tables used by test1
column TEST2 FORMAT A20
select * from extra_tables_view;
TEST1                TEST2                TABLE_NAME                      DELTAROWS
-------------------- -------------------- ------------------------------ ----------
AsyncTest1       AsyncTest2       WORK_ITEM                               1

Results

I used the tool to find out the following.  All tests were run using SOA Suite 11.1.1.7.

The following is based on a very simple composite as shown below:

Each BPEL process is basically the same as the one shown below:

Impact of Fault Policy Retry Being Executed OnceSettingTotal Rows Written Total Tables UpdatedNo Retry1312One Retry1513

When a fault policy causes a retry then the following additional database rows are written:

Table NameNumber of RowsAUDIT_TRAIL1WORK_ITEM1Impact of Setting Audit Level = Development Instead of ProductionSettingTotal Rows Written Total Tables UpdatedDevelopment1312Production1111

When the audit level is set at development instead of production then the following additional database rows are written:

Table NameNumber of RowsAUDIT_TRAIL1WORK_ITEM1Impact of Setting Audit Level = Production Instead of OffSettingTotal Rows Written Total Tables UpdatedProduction1111Off77

When the audit level is set at production rather than off then the following additional database rows are written:

Table NameNumber of RowsAUDIT_COUNTER1AUDIT_DETAILS1AUDIT_TRAIL1COMPOSITE_INSTANCE1Impact of Setting Capture Composite Instance StateSettingTotal Rows Written Total Tables UpdatedOn1312Off1312

When capture composite instance state is on rather than off then no additional database rows are written, note that there are other activities that occur when composite instance state is captured:

Impact of Setting oneWayDeliveryPolicy = async.cache or syncSettingTotal Rows Written Total Tables Updatedasync.persist1312async.cache77sync77

When choosing async.persist (the default) instead of sync or async.cache then the following additional database rows are written:

Table NameNumber of RowsAUDIT_DETAILS1DLV_MESSAGE1DOCUMENT_CI_REF1DOCUMENT_DLV_MSG_REF1HEADERS_PROPERTIES1XML_DOCUMENT1

As you would expect the sync mode behaves just as a regular synchronous (request/reply) interaction and creates the same number of rows in the database.  The async.cache also creates the same number of rows as a sync interaction because it stores state in memory and provides no restart guarantee.

Caveats & Warnings

The results above are based on a trivial test case.  The numbers will be different for bigger and more complex composites.  However by taking snapshots of different configurations you can produce the numbers that apply to your composites.

The capture procedure supports multiple steps in a test case, but the views only support two snapshots per test case.

Code Download

The sample project I used us available here.

The scripts used to create the user (createUser.sql), create the schema (createSchema.sql) and sample queries (TableCardinality.sql) are available here.

The Web Service wrapper to the capture state stored procedure is available here.

The sample SoapUI project that I used to take a snapshot, perform the test and take a second snapshot is available here.

The Impact of Change

Sun, 2014-03-09 16:01
Measuring Impact of Change in SOA Suite
Mormon prophet Thomas S. Monson once said:

When performance is measured, performance improves. When performance is measured and reported, the rate of performance accelerates.

(LDS Conference Report, October 1970, p107)

Like everything in life, a SOA Suite installation that is monitored and tracked has a much better chance of performing well than one that is not measured.  With that in mind I came up with tool to allow the measurement of the impact of configuration changes on database usage in SOA Suite.  This tool can be used to assess the impact of different configurations on both database growth and database performance, helping to decide which optimizations offer real benefit to the composite under test.

Basic Approach

The basic approach of the tool is to take a snapshot of the number of rows in the SOA tables before executing a composite.  The composite is then executed.  After the composite has completed another snapshot is taken of the SOA tables.  This is illustrated in the diagram below:

An example of the data collected by the tool is shown below:

Test Name Total Tables Changed Total Rows Added Notes AsyncTest1 13 15 Async Interaction with simple SOA composite, one retry to send response. AsyncTest2 12 13 Async interaction with simple SOA composite, no retries on sending response. AsyncTest3 12 13 Async interaction with simple SOA composite, no callback address provided. OneWayTest1 12 13 One-Way interaction with simple SOA composite. SyncTest1 7 7 Sync interaction with simple SOA composite.

Note that the first three columns are provided by the tool, the fourth column is just an aide-memoir to identify what the test name actually did. The tool also allows us to drill into the data to get a better look at what is actually changing as shown in the table below:

Test Name Table Name Rows Added AsyncTest1 AUDIT_COUNTER 1 AsyncTest1 AUDIT_DETAILS 1 AsyncTest1 AUDIT_TRAIL 2 AsyncTest1 COMPOSITE_INSTANCE 1 AsyncTest1 CUBE_INSTANCE 1 AsyncTest1 CUBE_SCOPE 1 AsyncTest1 DLV_MESSAGE 1 AsyncTest1 DOCUMENT_CI_REF 1 AsyncTest1 DOCUMENT_DLV_MSG_REF 1 AsyncTest1 HEADERS_PROPERTIES 1 AsyncTest1 INSTANCE_PAYLOAD 1 AsyncTest1 WORK_ITEM 1 AsyncTest1 XML_DOCUMENT 2

Here we have drilled into the test case with the retry of the callback to see what tables are actually being written to.

Finally we can compare two tests to see difference in the number of rows written and the tables updated as shown below:

Test Name Base Test Name Table Name Row Difference AsyncTest1 AsyncTest2 AUDIT_TRAIL 1

Here are the additional tables referenced by this test

Test Name Base Test Name Additional Table Name Rows Added AsyncTest1 AsyncTest2 WORK_ROWS 1 How it Works

I created a database stored procedure, soa_snapshot.take_soa_snaphot(test_name, phase). that queries all the SOA tables and records the number of rows in each table.  By running the stored procedure before and after the execution of a composite we can capture the number of rows in the SOA database before and after a composite executes.  I then created a view that shows the difference in the number of rows before and after composite execution.  This view has a number of sub-views that allow us to query specific items.  The schema is shown below:

The different tables and views are:

  • CHANGE_TABLE
    • Used to track number of rows in SOA schema, each test case has two or more phases.  Usually phase 1 is before execution and phase 2 is after execution.
    • This only used by the stored procedure and the views.
  • DELTA_VIEW
    • Used to track changes in number of rows in SOA database between phases of a test case.  This is a view on CHANGE_TABLE.  All other views are based off this view.
  • SIMPLE_DELTA_VIEW
    • Provides number of rows changed in each table.
  • SUMMARY_DELTA_VIEW
    • Provides a summary of total rows and tables changed.
  • DIFFERENT_ROWS_VIEW
    • Provides a summary of differences in rows updated between test cases
  • EXTRA_TABLES_VIEW
    • Provides a summary of the extra tables and rows used by a test case.
    • This view makes use of a session context, soa_ctx, which holds the test case name and the baseline test case name.  This context is initialized by calling the stored procedure soa_ctx_pkg.set(testCase, baseTestCase).

I created a web service wrapper to the take_soa_snapshot procedure so that I could use SoapUI to perform the tests.

Sample Output How many rows and tables did a particular test use?

Here we can see how many rows in how many tables changed as a result of running a test:

-- Display the total number of rows and tables changed for each test
select * from summary_delta_view
order by test_name;

TEST_NAME            TOTALDELTAROWS TOTALDELTASIZE TOTALTABLES
-------------------- -------------- -------------- -----------
AsyncTest1                   15              0          13
AsyncTest1noCCIS             15              0          13
AsyncTest1off                 8              0           8
AsyncTest1prod               13              0          12
AsyncTest2                   13              0          12
AsyncTest2noCCIS             13              0          12
AsyncTest2off                 7              0           7
AsyncTest2prod               11              0          11
AsyncTest3                   13              0          12
AsyncTest3noCCIS             13          65536          12
AsyncTest3off                 7              0           7
AsyncTest3prod               11              0          11
OneWayTest1                  13              0          12
OneWayTest1noCCI             13          65536          12
OneWayTest1off                7              0           7
OneWayTest1prod              11              0          11
SyncTest1                     7              0           7
SyncTest1noCCIS               7              0           7
SyncTest1off                  2              0           2
SyncTest1prod                 5              0           5

20 rows selected

Which tables grew during a test?

Here for a given test we can see which tables had rows inserted.

-- Display the tables which grew and show the number of rows they grew by
select * from simple_delta_view
where test_name='AsyncTest1'
order by table_name;
TEST_NAME            TABLE_NAME                      DELTAROWS  DELTASIZE
-------------------- ------------------------------ ---------- ----------
AsyncTest1       AUDIT_COUNTER                           1          0
AsyncTest1       AUDIT_DETAILS                           1          0
AsyncTest1       AUDIT_TRAIL                             2          0
AsyncTest1       COMPOSITE_INSTANCE                      1          0
AsyncTest1       CUBE_INSTANCE                           1          0
AsyncTest1       CUBE_SCOPE                              1          0
AsyncTest1       DLV_MESSAGE                             1          0
AsyncTest1       DOCUMENT_CI_REF                         1          0
AsyncTest1       DOCUMENT_DLV_MSG_REF                    1          0
AsyncTest1       HEADERS_PROPERTIES                      1          0
AsyncTest1       INSTANCE_PAYLOAD                        1          0
AsyncTest1       WORK_ITEM                               1          0
AsyncTest1       XML_DOCUMENT                            2          0
13 rows selected

Which tables grew more in test1 than in test2?

Here we can see the differences in rows for two tests.

-- Return difference in rows updated (test1)
select * from different_rows_view
where test1='AsyncTest1' and test2='AsyncTest2';

TEST1                TEST2                TABLE_NAME                          DELTA
-------------------- -------------------- ------------------------------ ----------
AsyncTest1       AsyncTest2       AUDIT_TRAIL                             1

Which tables were used by test1 but not by test2?

Here we can see tables that were used by one test but not by the other test.

-- Register base test case for use in extra_tables_view
-- First parameter (test1) is test we expect to have extra rows/tables
begin soa_ctx_pkg.set('AsyncTest1', 'AsyncTest2'); end;
/
anonymous block completed
-- Return additional tables used by test1
column TEST2 FORMAT A20
select * from extra_tables_view;
TEST1                TEST2                TABLE_NAME                      DELTAROWS
-------------------- -------------------- ------------------------------ ----------
AsyncTest1       AsyncTest2       WORK_ITEM                               1

 

Results

I used the tool to find out the following.  All tests were run using SOA Suite 11.1.1.7.

The following is based on a very simple composite as shown below:

Each BPEL process is basically the same as the one shown below:

Impact of Fault Policy Retry Being Executed Once Setting Total Rows Written Total Tables Updated No Retry 13 12 One Retry 15 13

When a fault policy causes a retry then the following additional database rows are written:

Table Name Number of Rows AUDIT_TRAIL 1 WORK_ITEM 1 Impact of Setting Audit Level = Development Instead of Production Setting Total Rows Written Total Tables Updated Development 13 12 Production 11 11

When the audit level is set at development instead of production then the following additional database rows are written:

Table Name Number of Rows AUDIT_TRAIL 1 WORK_ITEM 1 Impact of Setting Audit Level = Production Instead of Off Setting Total Rows Written Total Tables Updated Production 11 11 Off 7 7

When the audit level is set at production rather than off then the following additional database rows are written:

Table Name Number of Rows AUDIT_COUNTER 1 AUDIT_DETAILS 1 AUDIT_TRAIL 1 COMPOSITE_INSTANCE 1 Impact of Setting Capture Composite Instance State Setting Total Rows Written Total Tables Updated On 13 12 Off 13 12

When capture composite instance state is on rather than off then no additional database rows are written, note that there are other activities that occur when composite instance state is captured:

Impact of Setting oneWayDeliveryPolicy = async.cache or sync Setting Total Rows Written Total Tables Updated async.persist 13 12 async.cache 7 7 sync 7 7

When choosing async.persist (the default) instead of sync or async.cache then the following additional database rows are written:

Table Name Number of Rows AUDIT_DETAILS 1 DLV_MESSAGE 1 DOCUMENT_CI_REF 1 DOCUMENT_DLV_MSG_REF 1 HEADERS_PROPERTIES 1 XML_DOCUMENT 1

As you would expect the sync mode behaves just as a regular synchronous (request/reply) interaction and creates the same number of rows in the database.  The async.cache also creates the same number of rows as a sync interaction because it stores state in memory and provides no restart guarantee.

Caveats & Warnings

The results above are based on a trivial test case.  The numbers will be different for bigger and more complex composites.  However by taking snapshots of different configurations you can produce the numbers that apply to your composites.

The capture procedure supports multiple steps in a test case, but the views only support two snapshots per test case.

Code Download

The sample project I used us available here.

The scripts used to create the user (createUser.sql), create the schema (createSchema.sql) and sample queries (TableCardinality.sql) are available here.

The Web Service wrapper to the capture state stored procedure is available here.

The sample SoapUI project that I used to take a snapshot, perform the test and take a second snapshot is available here.

Clustering Events

Wed, 2014-02-26 13:25
Setting up an Oracle Event Processing Cluster

Recently I was working with Oracle Event Processing (OEP) and needed to set it up as part  of a high availability cluster.  OEP uses Coherence for quorum membership in an OEP cluster.  Because the solution used caching it was also necessary to include access to external Coherence nodes.  Input messages need to be duplicated across multiple OEP streams and so a JMS Topic adapter needed to be configured.  Finally only one copy of each output event was desired, requiring the use of an HA adapter.  In this blog post I will go through the steps required to implement a true HA OEP cluster.

OEP High Availability Review

The diagram below shows a very simple non-HA OEP configuration:

Events are received from a source (JMS in this blog).  The events are processed by an event processing network which makes use of a cache (Coherence in this blog).  Finally any output events are emitted.  The output events could go to any destination but in this blog we will emit them to a JMS queue.

OEP provides high availability by having multiple event processing instances processing the same event stream in an OEP cluster.  One instance acts as the primary and the other instances act as secondary processors.  Usually only the primary will output events as shown in the diagram below (top stream is the primary):

The actual event processing is the same as in the previous non-HA example.  What is different is how input and output events are handled.  Because we want to minimize or avoid duplicate events we have added an HA output adapter to the event processing network.  This adapter acts as a filter, so that only the primary stream will emit events to out queue.  If the processing of events within the network depends on how the time at which events are received then it is necessary to synchronize the event arrival time across the cluster by using an HA input adapter to synchronize the arrival timestamps of events across the cluster.

OEP Cluster Creation

Lets begin by setting up the base OEP cluster.  To do this we create new OEP configurations on each machine in the cluster.  The steps are outlined below.  Note that the same steps are performed on each machine for each server which will run on that machine:

  • Run ${MW_HOME}/ocep_11.1/common/bin/config.sh.
    • MW_HOME is the installation directory, note that multiple Fusion Middleware products may be installed in this directory.
  • When prompted “Create a new OEP domain”.
  • Provide administrator credentials.
    • Make sure you provide the same credentials on all machines in the cluster.
  • Specify a  “Server name” and “Server listen port”.
    • Each OEP server must have a unique name.
    • Different servers can share the same “Server listen port” unless they are running on the same host.
  • Provide keystore credentials.
    • Make sure you provide the same credentials on all machines in the cluster.
  • Configure any required JDBC data source.
  • Provide the “Domain Name” and “Domain location”.
    • All servers must have the same “Domain name”.
    • The “Domain location” may be different on each server, but I would keep it the same to simplify administration.
    • Multiple servers on the same machine can share the “Domain location” because their configuration will be placed in the directory corresponding to their server name.
  • Create domain!
Configuring an OEP Cluster

Now that we have created our servers we need to configure them so that they can find each other.  OEP uses Oracle Coherence to determine cluster membership.  Coherence clusters can use either multicast or unicast to discover already running members of a cluster.  Multicast has the advantage that it is easy to set up and scales better (see http://www.ateam-oracle.com/using-wka-in-large-coherence-clusters-disabling-multicast/) but has a number of challenges, including failure to propagate by default through routers and accidently joining the wrong cluster because someone else chose the same multicast settings.  We will show how to use both unicast and multicast to discover the cluster. 

Multicast DiscoveryUnicast DiscoveryCoherence multicast uses a class D multicast address that is shared by all servers in the cluster.  On startup a Coherence node broadcasts a message to the multicast address looking for an existing cluster.  If no-one responds then the node will start the cluster.Coherence unicast uses Well Known Addresses (WKAs). Each server in the cluster needs a dedicated listen address/port combination. A subset of these addresses are configured as WKAs and shared between all members of the cluster. As long as at least one of the WKAs is up and running then servers can join the cluster. If a server does not find any cluster members then it checks to see if its listen address and port are in the WKA list. If it is then that server will start the cluster, otherwise it will wait for a WKA server to become available. To configure a cluster the same steps need to be followed for each server in the cluster:
  • Set an event server address in the config.xml file.
    • Add the following to the <cluster> element:
      <cluster>
          <server-name>server1</server-name>
          <server-host-name>oep1.oracle.com</server-host-name>
      </cluster>
    • The “server-name” is displayed in the visualizer and should be unique to the server.

    • The “server-host-name” is used by the visualizer to access remote servers.

    • The “server-host-name” must be an IP address or it must resolve to an IP address that is accessible from all other servers in the cluster.

    • The listening port is configured in the <netio> section of the config.xml.

    • The server-host-name/listening port combination should be unique to each server.

 
  • Set a common cluster multicast listen address shared by all servers in the config.xml file.
    • Add the following to the <cluster> element:
      <cluster>
          …
          <!—For us in Coherence multicast only! –>
          <multicast-address>239.255.200.200</multicast-address>
          <multicast-port>9200</multicast-port>
      </cluster>
    • The “multicast-address” must be able to be routed through any routers between servers in the cluster.

  • Optionally you can specify the bind address of the server, this allows you to control port usage and determine which network is used by Coherence

    • Create a “tangosol-coherence-override.xml” file in the ${DOMAIN}/{SERVERNAME}/config directory for each server in the cluster.
      <?xml version='1.0'?>
      <coherence>
          <cluster-config>
              <unicast-listener>
                  <!—This server Coherence address and port number –>
                  <address>192.168.56.91</address>
                  <port>9200</port>
              </unicast-listener>
          </cluster-config>
      </coherence>
  • Configure the Coherence WKA cluster discovery.

    • Create a “tangosol-coherence-override.xml” file in the ${DOMAIN}/{SERVERNAME}/config directory for each server in the cluster.
      <?xml version='1.0'?>
      <coherence>
          <cluster-config>
              <unicast-listener>
                  <!—WKA Configuration –>
                  <well-known-addresses>
                      <socket-address id="1">
                          <address>192.168.56.91</address>
                          <port>9200</port>
                      </socket-address>
                      <socket-address id="2">
                          <address>192.168.56.92</address>
                          <port>9200</port>
                      </socket-address>
                  </well-known-addresses>
                  <!—This server Coherence address and port number –>
                  <address>192.168.56.91</address>
                  <port>9200</port>
              </unicast-listener>
          </cluster-config>
      </coherence>

    • List at least two servers in the <socket-address> elements.

    • For each <socket-address> element there should be a server that has corresponding <address> and <port> elements directly under <well-known-addresses>.

    • One of the servers listed in the <well-known-addresses> element must be the first server started.

    • Not all servers need to be listed in <well-known-addresses>, but see previous point.

 
  • Enable clustering using a Coherence cluster.
    • Add the following to the <cluster> element in config.xml.
      <cluster>
          …
          <enabled>true</enabled>
      </cluster>
    • The “enabled” element tells OEP that it will be using Coherence to establish cluster membership, this can also be achieved by setting the value to be “coherence”.

 
  • The following shows the <cluster> config for another server in the cluster with differences highlighted:
    <cluster>
        <server-name>server2</server-name>
        <server-host-name>oep2.oracle.com</server-host-name>
        <!—For us in Coherence multicast only! –>
        <multicast-address>239.255.200.200</multicast-address>
        <multicast-port>9200</multicast-port>
        <enabled>true</enabled>
    </cluster>

  • The following shows the <cluster> config for another server in the cluster with differences highlighted:
    <cluster>
        <server-name>server2</server-name>
        <server-host-name>oep2.oracle.com</server-host-name>
        <enabled>true</enabled>
    </cluster>

 
  • The following shows the “tangosol-coherence-override.xml” file for another server in the cluster with differences highlighted:
    <?xml version='1.0'?>
    <coherence>
        <cluster-config>
            <unicast-listener>
                <!—WKA Configuration –>
                <well-known-addresses>
                    <socket-address id="1">
                        <address>192.168.56.91</address>
                        <port>9200</port>
                    </socket-address>
                    <socket-address id="2">
                        <address>192.168.56.92</address>
                        <port>9200</port>
                    </socket-address>
                    <!—This server Coherence address and port number –>
                    <address>192.168.56.92</address>
                    <port>9200</port>
                </well-known-addresses>
            </unicast-listener>
        </cluster-config>
    </coherence>

You should now have a working OEP cluster.  Check the cluster by starting all the servers.

Look for a message like the following on the first server to start to indicate that another server has joined the cluster:

<Coherence> <BEA-2049108> <The domain membership has changed to [server2, server1], the new domain primary is "server1">

Log on to the Event Processing Visualizer of one of the servers – http://<hostname>:<port>/wlevs.  Select the cluster name on the left and then select group “AllDomainMembers”.  You should see a list of all the running servers in the “Servers of Group – AllDomainMembers” section.

Sample Application

Now that we have a working OEP cluster let us look at a simple application that can be used as an example of how to cluster enable an application.  This application models service request tracking for hardware products.  The application we will use performs the following checks:

  1. If a new service request (identified by SRID) arrives (indicated by status=RAISE) then we expect some sort of follow up in the next 10 seconds (seconds because I want to test this quickly).  If no follow up is seen then an alert should be raised.
    • For example if I receive an event (SRID=1, status=RAISE) and after 10 seconds I have not received a follow up message (SRID=1, status<>RAISE) then I need to raise an alert.
  2. If a service request (identified by SRID) arrives and there has been another service request (identified by a different SRID) for the same physcial hardware (identified by TAG) then an alert should be raised.
    • For example if I receive an event (SRID=2, TAG=M1) and later I receive another event for the same hardware (SRID=3, TAG=M1) then an alert should be raised.

Note use case 1 is nicely time bounded – in this case the time window is 10 seconds.  Hence this is an ideal candidate to be implemented entirely in CQL.

Use case 2 has no time constraints, hence over time there could be a very large number of CQL queries running looking for a matching TAG but a different SRID.  In this case it is better to put the TAGs into a cache and search the cache for duplicate tags.  This reduces the amount of state information held in the OEP engine.

The sample application to implement this is shown below:

Messages are received from a JMS Topic (InboundTopicAdapter).  Test messages can be injected via a CSV adapter (RequestEventCSVAdapter).  Alerts are sent to a JMS Queue (OutboundQueueAdapter), and also printed to the server standard output (PrintBean).  Use case 1 is implemented by the MissingEventProcessor.  Use case 2 is implemented by inserting the TAG into a cache (InsertServiceTagCacheBean) using a Coherence event processor and then querying the cache for each new service request (DuplicateTagProcessor), if the same tag is already associated with an SR in the cache then an alert is raised.  The RaiseEventFilter is used to filter out existing service requests from the use case 2 stream.

The non-HA version of the application is available to download here.

We will use this application to demonstrate how to HA enable an application for deployment on our cluster.

A CSV file (TestData.csv) and Load generator properties file (HADemoTest.prop) is provided to test the application by injecting events using the CSV Adapter.

Note that the application reads a configuration file (System.properties) which should be placed in the domain directory of each event server.

Deploying an Application

Before deploying an application to a cluster it is a good idea to create a group in the cluster.  Multiple servers can be members of this group.  To add a group to an event server just add an entry to the <cluster> element in config.xml as shown below:

<cluster>
      …
      <groups>HAGroup</groups>
   </cluster>

Multiple servers can be members of a group and a server can be a member of multiple groups.  This allows you to have different levels of high availability in the same event processing cluster.

Deploy the application using the Visualizer.  Target the application at the group you created, or the AllDomainMembers group.

Test the application, typically using a CSV Adapter.  Note that using a CSV adapter sends all the events to a single event server.  To fix this we need to add a JMS output adapter (OutboundTopicAdapter) to our application and then send events from the CSV adapter to the outbound JMS adapter as shown below:

So now we are able to send events via CSV to an event processor that in turn sends the events to a JMS topic.  But we still have a few challenges.

Managing Input

First challenge is managing input.  Because OEP relies on the same event stream being processed by multiple servers we need to make sure that all our servers get the same message from the JMS Topic.  To do this we configure the JMS connection factory to have an Unrestricted Client ID.  This allows multiple clients (OEP servers in our case) to use the same connection factory.  Client IDs are mandatory when using durable topic subscriptions.  We also need each event server to have its own subscriber ID for the JMS Topic, this ensures that each server will get a copy of all the messages posted to the topic.  If we use the same subscriber ID for all the servers then the messages will be distributed across the servers, with each server seeing a completely disjoint set of messages to the other servers in the cluster.  This is not what we want because each server should see the same event stream.  We can use the server name as the subscriber ID as shown in the below excerpt from our application:

<wlevs:adapter id="InboundTopicAdapter" provider="jms-inbound">
    …
    <wlevs:instance-property name="durableSubscriptionName"
            value="${com_bea_wlevs_configuration_server_ClusterType.serverName}" />
</wlevs:adapter>

This works because I have placed a ConfigurationPropertyPlaceholderConfigurer bean in my application as shown below, this same bean is also used to access properties from a configuration file:

<bean id="ConfigBean"
        class="com.bea.wlevs.spring.support.ConfigurationPropertyPlaceholderConfigurer">
        <property name="location" value="file:../Server.properties"/>
    </bean>

With this configuration each server will now get a copy of all the events.

As our application relies on elapsed time we should make sure that the timestamps of the received messages are the same on all servers.  We do this by adding an HA Input adapter to our application.

<wlevs:adapter id="HAInputAdapter" provider="ha-inbound">
    <wlevs:listener ref="RequestChannel" />
    <wlevs:instance-property name="keyProperties"
            value="EVID" />
    <wlevs:instance-property name="timeProperty" value="arrivalTime"/>
</wlevs:adapter>

The HA Adapter sets the given “timeProperty” in the input message to be the current system time.  This time is then communicated to other HAInputAdapters deployed to the same group.  This allows all servers in the group to have the same timestamp in their event.  The event is identified by the “keyProperties” key field.

To allow the downstream processing to treat the timestamp as an arrival time then the downstream channel is configured with an “application-timestamped” element to set the arrival time of the event.  This is shown below:

<wlevs:channel id="RequestChannel" event-type="ServiceRequestEvent">
    <wlevs:listener ref="MissingEventProcessor" />
    <wlevs:listener ref="RaiseEventFilterProcessor" />
    <wlevs:application-timestamped>
        <wlevs:expression>arrivalTime</wlevs:expression>
    </wlevs:application-timestamped>
</wlevs:channel>

Note the property set in the HAInputAdapter is used to set the arrival time of the event.

So now all servers in our cluster have the same events arriving from a topic, and each event arrival time is synchronized across the servers in the cluster.

Managing Output

Note that an OEP cluster has multiple servers processing the same input stream.  Obviously if we have the same inputs, synchronized to appear to arrive at the same time then we will get the same outputs, which is central to OEPs promise of high availability.  So when an alert is raised by our application it will be raised by every server in the cluster.  If we have 3 servers in the cluster then we will get 3 copies of the same alert appearing on our alert queue.  This is probably not what we want.  To fix this we take advantage of an HA Output Adapter.  unlike input where there is a single HA Input Adapter there are multiple HA Output Adapters, each with distinct performance and behavioral characteristics.  The table below is taken from the Oracle® Fusion Middleware Developer's Guide for Oracle Event Processing and shows the different levels of service and performance impact:

Table 24-1 Oracle Event Processing High Availability Quality of ServiceHigh Availability OptionMissed Events?Duplicate Events?Performance OverheadSection 24.1.2.1, "Simple Failover"Yes (many)Yes (few)NegligibleSection 24.1.2.2, "Simple Failover with Buffering"Yes (few)Foot 1Yes (many)LowSection 24.1.2.3, "Light-Weight Queue Trimming"NoYes (few)Low-MediumFoot 2 Section 24.1.2.4, "Precise Recovery with JMS"NoNoHigh

I decided to go for the lightweight queue trimming option.  This means I won’t lose any events, but I may emit a few duplicate events in the event of primary failure.  This setting causes all output events to be buffered by secondary's until they are told by the primary that a particular event has been emitted.  To configure this option I add the following adapter to my EPN:

    <wlevs:adapter id="HAOutputAdapter" provider="ha-broadcast">
        <wlevs:listener ref="OutboundQueueAdapter" />
        <wlevs:listener ref="PrintBean" />
        <wlevs:instance-property name="keyProperties" value="timestamp"/>
        <wlevs:instance-property name="monotonic" value="true"/>
        <wlevs:instance-property name="totalOrder" value="false"/>
    </wlevs:adapter>

This uses the time of the alert (timestamp property) as the key to be used to identify events which have been trimmed.  This works in this application because the alert time is the time of the source event, and the time of the source events are synchronized using the HA Input Adapter.  Because this is a time value then it will increase, and so I set monotonic=”true”.  However I may get two alerts raised at the same timestamp and in that case I set totalOrder=”false”.

I also added the additional configuration to config.xml for the application:

<ha:ha-broadcast-adapter>
    <name>HAOutputAdapter</name>
    <warm-up-window-length units="seconds">15</warm-up-window-length>
    <trimming-interval units="millis">1000</trimming-interval>
</ha:ha-broadcast-adapter>

This causes the primary to tell the secondary's which is its latest emitted alert every 1 second.  This will cause the secondary's to trim from their buffers all alerts prior to and including the latest emitted alerts.  So in the worst case I will get one second of duplicated alerts.  It is also possible to set a number of events rather than a time period.  The trade off here is that I can reduce synchronization overhead by having longer time intervals or more events, causing more memory to be used by the secondary's or I can cause more frequent synchronization, using less memory in the secondary's and generating fewer duplicate alerts but there will be more communication between the primary and the secondary's to trim the buffer.

The warm-up window is used to stop a secondary joining the cluster before it has been running for that time period.  The window is based on the time that the EPN needs to be running to be have the same state as the other servers.  In our example application we have a CQL that runs for a period of 10 seconds, so I set the warm up window to be 15 seconds to ensure that a newly started server had the same state as all the other servers in the cluster.  The warm up window should be greater than the longest query window.

Adding an External Coherence Cluster

When we are running OEP as a cluster then we have additional overhead in the servers.  The HA Input Adapter is synchronizing event time across the servers, the HA Output adapter is synchronizing output events across the servers.  The HA Output adapter is also buffering output events in the secondary’s.  We can’t do anything about this but we can move the Coherence Cache we are using outside of the OEP servers, reducing the memory pressure on those servers and also moving some of the processing outside of the server.  Making our Coherence caches external to our OEP cluster is a good idea for the following reasons:

  • Allows moving storage of cache entries outside of the OEP server JVMs hence freeing more memory for storing CQL state.
  • Allows storage of more entries in the cache by scaling cache independently of the OEP cluster.
  • Moves cache processing outside OEP servers.

To create the external Coherence cache do the following:

  • Create a new directory for our standalone Coherence servers, perhaps at the same level as the OEP domain directory.
  • Copy the tangosol-coherence-override.xml file previously created for the OEP cluster into a config directory under the Coherence directory created in the previous step.
  • Copy the coherence-cache-config.xml file from the application into a config directory under the Coherence directory created in the previous step.
  • Add the following to the tangosol-coherence-override.xml file in the Coherence config directory:
    • <coherence>
          <cluster-config>
              <member-identity>
                  <cluster-name>oep_cluster</cluster-name>
                  <member-name>Grid1</member-name>
              </member-identity>
              …
          </cluster-config>
      </coherence>
    • Important Note: The <cluster-name> must match the name of the OEP cluster as defined in the <domain><name> element in the event servers config.xml.
    • The member name is used to help identify the server.
  • Disable storage for our caches in the event servers by editing the coherence-cache-config.xml file in the application and adding the following element to the caches:
    • <distributed-scheme>
          <scheme-name>DistributedCacheType</scheme-name>
          <service-name>DistributedCache</service-name>
          <backing-map-scheme>
              <local-scheme/>
          </backing-map-scheme>
          <local-storage>false</local-storage>
      </distributed-scheme>
    • The local-storage flag stops the OEP server from storing entries for caches using this cache schema.
    • Do not disable storage at the global level (-Dtangosol.coherence.distributed.localstorage=false) because this will disable storage on some OEP specific cache schemes as well as our application cache.  We don’t want to put those schemes into our cache servers because they are used by OEP to maintain cluster integrity and have only one entry per application per server, so are very small.  If we put those into our Coherence Cache servers we would have to add OEP specific libraries to our cache servers and enable them in our coherence-cache-config.xml, all of which is too much trouble for little or no benefit.
  • If using Unicast Discovery (this section is not required if using Multicast) then we want to make the Coherence Grid be the Well Known Address servers because we want to disable storage of entries on our OEP servers, and Coherence nodes with storage disabled cannot initialize a cluster.  To enable the Coherence servers to be primaries in the Coherence grid do the following:
    • Change the unicast-listener addresses in the Coherence servers tangosol-coherence-override.xml file to be suitable values for the machine they are running on – typically change the listen address.
    • Modify the WKA addresses in the OEP servers and the Coherence servers tangosol-coherence-override.xml file to match at least two of the Coherence servers listen addresses.
    • The following table shows how this might be configured for 2 OEP servers and 2 Cache servers
      OEP Server 1OEP Server 2Cache Server 1Cache Server 2

      <?xml version='1.0'?>
      <coherence>
        <cluster-config>








          <unicast-listener>
            <well-known-addresses>
              <socket-address id="1">
                <address>
                  192.168.56.91
               
      </address>
                <port>9300</port>
              </socket-address>
              <socket-address id="2">
                <address>
                  192.168.56.92
               
      </address>
                <port>9300</port>
              </socket-address>
            </well-known-addresses>
            <address>
              192.168.56.91
           
      </address>
            <port>9200</port>
          </unicast-listener>
        </cluster-config>
      </coherence>

      <?xml version='1.0'?>
      <coherence>
        <cluster-config>








          <unicast-listener>
            <well-known-addresses>
              <socket-address id="1">
                <address>
                  192.168.56.91
               
      </address>
                <port>9300</port>
              </socket-address>
              <socket-address id="2">
                <address>
                  192.168.56.92
               
      </address>
                <port>9300</port>
              </socket-address>
            </well-known-addresses>
            <address>
              192.168.56.92
           
      </address>
            <port>9200</port>
          </unicast-listener>
        </cluster-config>
      </coherence>

      <?xml version='1.0'?>
      <coherence>
        <cluster-config>
          <member-identity>
            <cluster-name>
              oep_cluster
            </cluster-name>
            <member-name>
              Grid1
            </member-name>
          </member-identity>
          <unicast-listener>
            <well-known-addresses>
              <socket-address id="1">
                <address>
                  192.168.56.91
               
      </address>
                <port>9300</port>
              </socket-address>
              <socket-address id="2">
                <address>
                  192.168.56.92
               
      </address>
                <port>9300</port>
              </socket-address>
            </well-known-addresses>
            <address>
              192.168.56.91
           
      </address>
            <port>9300</port>
          </unicast-listener>
        </cluster-config>
      </coherence>

      <?xml version='1.0'?>
      <coherence>
        <cluster-config>
          <member-identity>
            <cluster-name>
              oep_cluster
            </cluster-name>
            <member-name>
              Grid2
            </member-name>
          </member-identity>
          <unicast-listener>
            <well-known-addresses>
              <socket-address id="1">
                <address>
                  192.168.56.91
               
      </address>
                <port>9300</port>
              </socket-address>
              <socket-address id="2">
                <address>
                  192.168.56.92
               
      </address>
                <port>9300</port>
              </socket-address>
            </well-known-addresses>
            <address>
              192.168.56.92
           
      </address>
            <port>9300</port>
          </unicast-listener>
        </cluster-config>
      </coherence>

    • Note that the OEP servers do not listen on the WKA addresses, using different port numbers even though they run on the same servers as the cache servers.
    • Also not that the Coherence servers are the ones that listen on the WKA addresses.
  • Now that the configuration is complete we can create a start script for the Coherence grid servers as follows:
    • #!/bin/sh
      MW_HOME=/home/oracle/fmw
      OEP_HOME=${MW_HOME}/ocep_11.1
      JAVA_HOME=${MW_HOME}/jrockit_160_33
      CACHE_SERVER_HOME=${MW_HOME}/user_projects/domains/oep_coherence
      CACHE_SERVER_CLASSPATH=${CACHE_SERVER_HOME}/HADemoCoherence.jar:${CACHE_SERVER_HOME}/config
      COHERENCE_JAR=${OEP_HOME}/modules/com.tangosol.coherence_3.7.1.6.jar
      JAVAEXEC=$JAVA_HOME/bin/java
      # specify the JVM heap size
      MEMORY=512m
      if [[ $1 == '-jmx' ]]; then
          JMXPROPERTIES="-Dcom.sun.management.jmxremote -Dtangosol.coherence.management=all -Dtangosol.coherence.management.remote=true"
          shift
      fi
      JAVA_OPTS="-Xms$MEMORY -Xmx$MEMORY $JMXPROPERTIES"
      $JAVAEXEC -server -showversion $JAVA_OPTS -cp "${CACHE_SERVER_CLASSPATH}:${COHERENCE_JAR}" com.tangosol.net.DefaultCacheServer $1
    • Note that I put the tangosol-coherence-override and the coherence-cache-config.xml files in a config directory and added that directory to my path (CACHE_SERVER_CLASSPATH=${CACHE_SERVER_HOME}/HADemoCoherence.jar:${CACHE_SERVER_HOME}/config) so that Coherence would find the override file.
    • Because my application uses in-cache processing (entry processors) I had to add a jar file containing the required classes for the entry processor to the classpath (CACHE_SERVER_CLASSPATH=${CACHE_SERVER_HOME}/HADemoCoherence.jar:${CACHE_SERVER_HOME}/config).
    • The classpath references the Coherence Jar shipped with OEP to avoid versoin mismatches (COHERENCE_JAR=${OEP_HOME}/modules/com.tangosol.coherence_3.7.1.6.jar).
    • This script is based on the standard cache-server.sh script that ships with standalone Coherence.
    • The –jmx flag can be passed to the script to enable Coherence JMX management beans.

We have now configured Coherence to use an external data grid for its application caches.  When starting we should always start at least one of the grid servers before starting the OEP servers.  This will allow the OEP server to find the grid.  If we do start things in the wrong order then the OEP servers will block waiting for a storage enabled node to start (one of the WKA servers if using Unicast).

Summary

We have now created an OEP cluster that makes use of an external Coherence grid for application caches.  The application has been modified to ensure that the timestamps of arriving events are synchronized and the output events are only output by one of the servers in the cluster.  In event of failure we may get some duplicate events with our configuration (there are configurations that avoid duplicate events) but we will not lose any events.  The final version of the application with full HA capability is shown below:

Files

The following files are available for download:

  • Oracle Event Processing
    • Includes Coherence
  • None-HA version of application
    • Includes test file TestData.csv and Load Test property file HADemoTest.prop
    • Includes Server.properties.Antony file to customize to point to your WLS installation
  • HA version of application
    • Includes test file TestData.csv and Load Test property file HADemoTest.prop
    • Includes Server.properties.Antony file to customize to point to your WLS installation
  • OEP Cluster Files
    • Includes config.xml
    • Includes tangosol-coherence-override.xml
    • Includes Server.properties that will need customizing for your WLS environment
  • Coherence Cluster Files
    • Includes tangosol-coherence-override.xml and coherence-cache-configuration.xml
    • includes cache-server.sh start script
    • Includes HADemoCoherence.jar with required classes for entry processor
References

The following references may be helpful:

Clustering Events

Wed, 2014-02-26 13:25
Setting up an Oracle Event Processing Cluster

Recently I was working with Oracle Event Processing (OEP) and needed to set it up as part  of a high availability cluster.  OEP uses Coherence for quorum membership in an OEP cluster.  Because the solution used caching it was also necessary to include access to external Coherence nodes.  Input messages need to be duplicated across multiple OEP streams and so a JMS Topic adapter needed to be configured.  Finally only one copy of each output event was desired, requiring the use of an HA adapter.  In this blog post I will go through the steps required to implement a true HA OEP cluster.

OEP High Availability Review

The diagram below shows a very simple non-HA OEP configuration:

Events are received from a source (JMS in this blog).  The events are processed by an event processing network which makes use of a cache (Coherence in this blog).  Finally any output events are emitted.  The output events could go to any destination but in this blog we will emit them to a JMS queue.

OEP provides high availability by having multiple event processing instances processing the same event stream in an OEP cluster.  One instance acts as the primary and the other instances act as secondary processors.  Usually only the primary will output events as shown in the diagram below (top stream is the primary):

The actual event processing is the same as in the previous non-HA example.  What is different is how input and output events are handled.  Because we want to minimize or avoid duplicate events we have added an HA output adapter to the event processing network.  This adapter acts as a filter, so that only the primary stream will emit events to out queue.  If the processing of events within the network depends on how the time at which events are received then it is necessary to synchronize the event arrival time across the cluster by using an HA input adapter to synchronize the arrival timestamps of events across the cluster.

OEP Cluster Creation

Lets begin by setting up the base OEP cluster.  To do this we create new OEP configurations on each machine in the cluster.  The steps are outlined below.  Note that the same steps are performed on each machine for each server which will run on that machine:

  • Run ${MW_HOME}/ocep_11.1/common/bin/config.sh.
    • MW_HOME is the installation directory, note that multiple Fusion Middleware products may be installed in this directory.
  • When prompted “Create a new OEP domain”.
  • Provide administrator credentials.
    • Make sure you provide the same credentials on all machines in the cluster.
  • Specify a  “Server name” and “Server listen port”.
    • Each OEP server must have a unique name.
    • Different servers can share the same “Server listen port” unless they are running on the same host.
  • Provide keystore credentials.
    • Make sure you provide the same credentials on all machines in the cluster.
  • Configure any required JDBC data source.
  • Provide the “Domain Name” and “Domain location”.
    • All servers must have the same “Domain name”.
    • The “Domain location” may be different on each server, but I would keep it the same to simplify administration.
    • Multiple servers on the same machine can share the “Domain location” because their configuration will be placed in the directory corresponding to their server name.
  • Create domain!
Configuring an OEP Cluster

Now that we have created our servers we need to configure them so that they can find each other.  OEP uses Oracle Coherence to determine cluster membership.  Coherence clusters can use either multicast or unicast to discover already running members of a cluster.  Multicast has the advantage that it is easy to set up and scales better (see http://www.ateam-oracle.com/using-wka-in-large-coherence-clusters-disabling-multicast/) but has a number of challenges, including failure to propagate by default through routers and accidently joining the wrong cluster because someone else chose the same multicast settings.  We will show how to use both unicast and multicast to discover the cluster. 

Multicast Discovery Unicast Discovery Coherence multicast uses a class D multicast address that is shared by all servers in the cluster.  On startup a Coherence node broadcasts a message to the multicast address looking for an existing cluster.  If no-one responds then the node will start the cluster. Coherence unicast uses Well Known Addresses (WKAs). Each server in the cluster needs a dedicated listen address/port combination. A subset of these addresses are configured as WKAs and shared between all members of the cluster. As long as at least one of the WKAs is up and running then servers can join the cluster. If a server does not find any cluster members then it checks to see if its listen address and port are in the WKA list. If it is then that server will start the cluster, otherwise it will wait for a WKA server to become available.   To configure a cluster the same steps need to be followed for each server in the cluster:
  • Set an event server address in the config.xml file.
    • Add the following to the <cluster> element:
      <cluster>
          <server-name>server1</server-name>
          <server-host-name>oep1.oracle.com</server-host-name>
      </cluster>
    • The “server-name” is displayed in the visualizer and should be unique to the server.

    • The “server-host-name” is used by the visualizer to access remote servers.

    • The “server-host-name” must be an IP address or it must resolve to an IP address that is accessible from all other servers in the cluster.

    • The listening port is configured in the <netio> section of the config.xml.

    • The server-host-name/listening port combination should be unique to each server.

 
  • Set a common cluster multicast listen address shared by all servers in the config.xml file.
    • Add the following to the <cluster> element:
      <cluster>
          …
          <!—For us in Coherence multicast only! –>
          <multicast-address>239.255.200.200</multicast-address>
          <multicast-port>9200</multicast-port>
      </cluster>
    • The “multicast-address” must be able to be routed through any routers between servers in the cluster.

  • Optionally you can specify the bind address of the server, this allows you to control port usage and determine which network is used by Coherence

    • Create a “tangosol-coherence-override.xml” file in the ${DOMAIN}/{SERVERNAME}/config directory for each server in the cluster.
      <?xml version='1.0'?>
      <coherence>
          <cluster-config>
              <unicast-listener>
                  <!—This server Coherence address and port number –>
                  <address>192.168.56.91</address>
                  <port>9200</port>
              </unicast-listener>
          </cluster-config>
      </coherence>
  • Configure the Coherence WKA cluster discovery.

    • Create a “tangosol-coherence-override.xml” file in the ${DOMAIN}/{SERVERNAME}/config directory for each server in the cluster.
      <?xml version='1.0'?>
      <coherence>
          <cluster-config>
              <unicast-listener>
                  <!—WKA Configuration –>
                  <well-known-addresses>
                      <socket-address id="1">
                          <address>192.168.56.91</address>
                          <port>9200</port>
                      </socket-address>
                      <socket-address id="2">
                          <address>192.168.56.92</address>
                          <port>9200</port>
                      </socket-address>
                  </well-known-addresses>
                  <!—This server Coherence address and port number –>
                  <address>192.168.56.91</address>
                  <port>9200</port>
              </unicast-listener>
          </cluster-config>
      </coherence>

    • List at least two servers in the <socket-address> elements.

    • For each <socket-address> element there should be a server that has corresponding <address> and <port> elements directly under <well-known-addresses>.

    • One of the servers listed in the <well-known-addresses> element must be the first server started.

    • Not all servers need to be listed in <well-known-addresses>, but see previous point.

 
  • Enable clustering using a Coherence cluster.
    • Add the following to the <cluster> element in config.xml.
      <cluster>
          …
          <enabled>true</enabled>
      </cluster>
    • The “enabled” element tells OEP that it will be using Coherence to establish cluster membership, this can also be achieved by setting the value to be “coherence”.

 
  • The following shows the <cluster> config for another server in the cluster with differences highlighted:
    <cluster>
        <server-name>server2</server-name>
        <server-host-name>oep2.oracle.com</server-host-name>
        <!—For us in Coherence multicast only! –>
        <multicast-address>239.255.200.200</multicast-address>
        <multicast-port>9200</multicast-port>
        <enabled>true</enabled>
    </cluster>

  • The following shows the <cluster> config for another server in the cluster with differences highlighted:
    <cluster>
        <server-name>server2</server-name>
        <server-host-name>oep2.oracle.com</server-host-name>
        <enabled>true</enabled>
    </cluster>

 
  • The following shows the “tangosol-coherence-override.xml” file for another server in the cluster with differences highlighted:
    <?xml version='1.0'?>
    <coherence>
        <cluster-config>
            <unicast-listener>
                <!—WKA Configuration –>
                <well-known-addresses>
                    <socket-address id="1">
                        <address>192.168.56.91</address>
                        <port>9200</port>
                    </socket-address>
                    <socket-address id="2">
                        <address>192.168.56.92</address>
                        <port>9200</port>
                    </socket-address>
                    <!—This server Coherence address and port number –>
                    <address>192.168.56.92</address>
                    <port>9200</port>
                </well-known-addresses>
            </unicast-listener>
        </cluster-config>
    </coherence>

You should now have a working OEP cluster.  Check the cluster by starting all the servers.

Look for a message like the following on the first server to start to indicate that another server has joined the cluster:

<Coherence> <BEA-2049108> <The domain membership has changed to [server2, server1], the new domain primary is "server1">

Log on to the Event Processing Visualizer of one of the servers – http://<hostname>:<port>/wlevs.  Select the cluster name on the left and then select group “AllDomainMembers”.  You should see a list of all the running servers in the “Servers of Group – AllDomainMembers” section.

Sample Application

Now that we have a working OEP cluster let us look at a simple application that can be used as an example of how to cluster enable an application.  This application models service request tracking for hardware products.  The application we will use performs the following checks:

  1. If a new service request (identified by SRID) arrives (indicated by status=RAISE) then we expect some sort of follow up in the next 10 seconds (seconds because I want to test this quickly).  If no follow up is seen then an alert should be raised.
    • For example if I receive an event (SRID=1, status=RAISE) and after 10 seconds I have not received a follow up message (SRID=1, status<>RAISE) then I need to raise an alert.
  2. If a service request (identified by SRID) arrives and there has been another service request (identified by a different SRID) for the same physcial hardware (identified by TAG) then an alert should be raised.
    • For example if I receive an event (SRID=2, TAG=M1) and later I receive another event for the same hardware (SRID=3, TAG=M1) then an alert should be raised.

Note use case 1 is nicely time bounded – in this case the time window is 10 seconds.  Hence this is an ideal candidate to be implemented entirely in CQL.

Use case 2 has no time constraints, hence over time there could be a very large number of CQL queries running looking for a matching TAG but a different SRID.  In this case it is better to put the TAGs into a cache and search the cache for duplicate tags.  This reduces the amount of state information held in the OEP engine.

The sample application to implement this is shown below:

Messages are received from a JMS Topic (InboundTopicAdapter).  Test messages can be injected via a CSV adapter (RequestEventCSVAdapter).  Alerts are sent to a JMS Queue (OutboundQueueAdapter), and also printed to the server standard output (PrintBean).  Use case 1 is implemented by the MissingEventProcessor.  Use case 2 is implemented by inserting the TAG into a cache (InsertServiceTagCacheBean) using a Coherence event processor and then querying the cache for each new service request (DuplicateTagProcessor), if the same tag is already associated with an SR in the cache then an alert is raised.  The RaiseEventFilter is used to filter out existing service requests from the use case 2 stream.

The non-HA version of the application is available to download here.

We will use this application to demonstrate how to HA enable an application for deployment on our cluster.

A CSV file (TestData.csv) and Load generator properties file (HADemoTest.prop) is provided to test the application by injecting events using the CSV Adapter.

Note that the application reads a configuration file (System.properties) which should be placed in the domain directory of each event server.

Deploying an Application

Before deploying an application to a cluster it is a good idea to create a group in the cluster.  Multiple servers can be members of this group.  To add a group to an event server just add an entry to the <cluster> element in config.xml as shown below:

<cluster>
      …
      <groups>HAGroup</groups>
   </cluster>

Multiple servers can be members of a group and a server can be a member of multiple groups.  This allows you to have different levels of high availability in the same event processing cluster.

Deploy the application using the Visualizer.  Target the application at the group you created, or the AllDomainMembers group.

Test the application, typically using a CSV Adapter.  Note that using a CSV adapter sends all the events to a single event server.  To fix this we need to add a JMS output adapter (OutboundTopicAdapter) to our application and then send events from the CSV adapter to the outbound JMS adapter as shown below:

So now we are able to send events via CSV to an event processor that in turn sends the events to a JMS topic.  But we still have a few challenges.

Managing Input

First challenge is managing input.  Because OEP relies on the same event stream being processed by multiple servers we need to make sure that all our servers get the same message from the JMS Topic.  To do this we configure the JMS connection factory to have an Unrestricted Client ID.  This allows multiple clients (OEP servers in our case) to use the same connection factory.  Client IDs are mandatory when using durable topic subscriptions.  We also need each event server to have its own subscriber ID for the JMS Topic, this ensures that each server will get a copy of all the messages posted to the topic.  If we use the same subscriber ID for all the servers then the messages will be distributed across the servers, with each server seeing a completely disjoint set of messages to the other servers in the cluster.  This is not what we want because each server should see the same event stream.  We can use the server name as the subscriber ID as shown in the below excerpt from our application:

<wlevs:adapter id="InboundTopicAdapter" provider="jms-inbound">
    …
    <wlevs:instance-property name="durableSubscriptionName"
            value="${com_bea_wlevs_configuration_server_ClusterType.serverName}" />
</wlevs:adapter>

This works because I have placed a ConfigurationPropertyPlaceholderConfigurer bean in my application as shown below, this same bean is also used to access properties from a configuration file:

<bean id="ConfigBean"
        class="com.bea.wlevs.spring.support.ConfigurationPropertyPlaceholderConfigurer">
        <property name="location" value="file:../Server.properties"/>
    </bean>

With this configuration each server will now get a copy of all the events.

As our application relies on elapsed time we should make sure that the timestamps of the received messages are the same on all servers.  We do this by adding an HA Input adapter to our application.

<wlevs:adapter id="HAInputAdapter" provider="ha-inbound">
    <wlevs:listener ref="RequestChannel" />
    <wlevs:instance-property name="keyProperties"
            value="EVID" />
    <wlevs:instance-property name="timeProperty" value="arrivalTime"/>
</wlevs:adapter>

The HA Adapter sets the given “timeProperty” in the input message to be the current system time.  This time is then communicated to other HAInputAdapters deployed to the same group.  This allows all servers in the group to have the same timestamp in their event.  The event is identified by the “keyProperties” key field.

To allow the downstream processing to treat the timestamp as an arrival time then the downstream channel is configured with an “application-timestamped” element to set the arrival time of the event.  This is shown below:

<wlevs:channel id="RequestChannel" event-type="ServiceRequestEvent">
    <wlevs:listener ref="MissingEventProcessor" />
    <wlevs:listener ref="RaiseEventFilterProcessor" />
    <wlevs:application-timestamped>
        <wlevs:expression>arrivalTime</wlevs:expression>
    </wlevs:application-timestamped>
</wlevs:channel>

Note the property set in the HAInputAdapter is used to set the arrival time of the event.

So now all servers in our cluster have the same events arriving from a topic, and each event arrival time is synchronized across the servers in the cluster.

Managing Output

Note that an OEP cluster has multiple servers processing the same input stream.  Obviously if we have the same inputs, synchronized to appear to arrive at the same time then we will get the same outputs, which is central to OEPs promise of high availability.  So when an alert is raised by our application it will be raised by every server in the cluster.  If we have 3 servers in the cluster then we will get 3 copies of the same alert appearing on our alert queue.  This is probably not what we want.  To fix this we take advantage of an HA Output Adapter.  unlike input where there is a single HA Input Adapter there are multiple HA Output Adapters, each with distinct performance and behavioral characteristics.  The table below is taken from the Oracle® Fusion Middleware Developer's Guide for Oracle Event Processing and shows the different levels of service and performance impact:

Table 24-1 Oracle Event Processing High Availability Quality of Service High Availability Option Missed Events? Duplicate Events? Performance Overhead Section 24.1.2.1, "Simple Failover" Yes (many) Yes (few) Negligible Section 24.1.2.2, "Simple Failover with Buffering" Yes (few)Foot 1 Yes (many) Low Section 24.1.2.3, "Light-Weight Queue Trimming" No Yes (few) Low-MediumFoot 2 Section 24.1.2.4, "Precise Recovery with JMS" No No High

I decided to go for the lightweight queue trimming option.  This means I won’t lose any events, but I may emit a few duplicate events in the event of primary failure.  This setting causes all output events to be buffered by secondary's until they are told by the primary that a particular event has been emitted.  To configure this option I add the following adapter to my EPN:

    <wlevs:adapter id="HAOutputAdapter" provider="ha-broadcast">
        <wlevs:listener ref="OutboundQueueAdapter" />
        <wlevs:listener ref="PrintBean" />
        <wlevs:instance-property name="keyProperties" value="timestamp"/>
        <wlevs:instance-property name="monotonic" value="true"/>
        <wlevs:instance-property name="totalOrder" value="false"/>
    </wlevs:adapter>

This uses the time of the alert (timestamp property) as the key to be used to identify events which have been trimmed.  This works in this application because the alert time is the time of the source event, and the time of the source events are synchronized using the HA Input Adapter.  Because this is a time value then it will increase, and so I set monotonic=”true”.  However I may get two alerts raised at the same timestamp and in that case I set totalOrder=”false”.

I also added the additional configuration to config.xml for the application:

<ha:ha-broadcast-adapter>
    <name>HAOutputAdapter</name>
    <warm-up-window-length units="seconds">15</warm-up-window-length>
    <trimming-interval units="millis">1000</trimming-interval>
</ha:ha-broadcast-adapter>

This causes the primary to tell the secondary's which is its latest emitted alert every 1 second.  This will cause the secondary's to trim from their buffers all alerts prior to and including the latest emitted alerts.  So in the worst case I will get one second of duplicated alerts.  It is also possible to set a number of events rather than a time period.  The trade off here is that I can reduce synchronization overhead by having longer time intervals or more events, causing more memory to be used by the secondary's or I can cause more frequent synchronization, using less memory in the secondary's and generating fewer duplicate alerts but there will be more communication between the primary and the secondary's to trim the buffer.

The warm-up window is used to stop a secondary joining the cluster before it has been running for that time period.  The window is based on the time that the EPN needs to be running to be have the same state as the other servers.  In our example application we have a CQL that runs for a period of 10 seconds, so I set the warm up window to be 15 seconds to ensure that a newly started server had the same state as all the other servers in the cluster.  The warm up window should be greater than the longest query window.

Adding an External Coherence Cluster

When we are running OEP as a cluster then we have additional overhead in the servers.  The HA Input Adapter is synchronizing event time across the servers, the HA Output adapter is synchronizing output events across the servers.  The HA Output adapter is also buffering output events in the secondary’s.  We can’t do anything about this but we can move the Coherence Cache we are using outside of the OEP servers, reducing the memory pressure on those servers and also moving some of the processing outside of the server.  Making our Coherence caches external to our OEP cluster is a good idea for the following reasons:

  • Allows moving storage of cache entries outside of the OEP server JVMs hence freeing more memory for storing CQL state.
  • Allows storage of more entries in the cache by scaling cache independently of the OEP cluster.
  • Moves cache processing outside OEP servers.

To create the external Coherence cache do the following:

  • Create a new directory for our standalone Coherence servers, perhaps at the same level as the OEP domain directory.
  • Copy the tangosol-coherence-override.xml file previously created for the OEP cluster into a config directory under the Coherence directory created in the previous step.
  • Copy the coherence-cache-config.xml file from the application into a config directory under the Coherence directory created in the previous step.
  • Add the following to the tangosol-coherence-override.xml file in the Coherence config directory:
    • <coherence>
          <cluster-config>
              <member-identity>
                  <cluster-name>oep_cluster</cluster-name>
                  <member-name>Grid1</member-name>
              </member-identity>
              …
          </cluster-config>
      </coherence>
    • Important Note: The <cluster-name> must match the name of the OEP cluster as defined in the <domain><name> element in the event servers config.xml.
    • The member name is used to help identify the server.
  • Disable storage for our caches in the event servers by editing the coherence-cache-config.xml file in the application and adding the following element to the caches:
    • <distributed-scheme>
          <scheme-name>DistributedCacheType</scheme-name>
          <service-name>DistributedCache</service-name>
          <backing-map-scheme>
              <local-scheme/>
          </backing-map-scheme>
          <local-storage>false</local-storage>
      </distributed-scheme>
    • The local-storage flag stops the OEP server from storing entries for caches using this cache schema.
    • Do not disable storage at the global level (-Dtangosol.coherence.distributed.localstorage=false) because this will disable storage on some OEP specific cache schemes as well as our application cache.  We don’t want to put those schemes into our cache servers because they are used by OEP to maintain cluster integrity and have only one entry per application per server, so are very small.  If we put those into our Coherence Cache servers we would have to add OEP specific libraries to our cache servers and enable them in our coherence-cache-config.xml, all of which is too much trouble for little or no benefit.
  • If using Unicast Discovery (this section is not required if using Multicast) then we want to make the Coherence Grid be the Well Known Address servers because we want to disable storage of entries on our OEP servers, and Coherence nodes with storage disabled cannot initialize a cluster.  To enable the Coherence servers to be primaries in the Coherence grid do the following:
    • Change the unicast-listener addresses in the Coherence servers tangosol-coherence-override.xml file to be suitable values for the machine they are running on – typically change the listen address.
    • Modify the WKA addresses in the OEP servers and the Coherence servers tangosol-coherence-override.xml file to match at least two of the Coherence servers listen addresses.
    • The following table shows how this might be configured for 2 OEP servers and 2 Cache servers
      OEP Server 1 OEP Server 2 Cache Server 1 Cache Server 2

      <?xml version='1.0'?>
      <coherence>
        <cluster-config>








          <unicast-listener>
            <well-known-addresses>
              <socket-address id="1">
                <address>
                  192.168.56.91
               
      </address>
                <port>9300</port>
              </socket-address>
              <socket-address id="2">
                <address>
                  192.168.56.92
               
      </address>
                <port>9300</port>
              </socket-address>
            </well-known-addresses>
            <address>
              192.168.56.91
           
      </address>
            <port>9200</port>
          </unicast-listener>
        </cluster-config>
      </coherence>

      <?xml version='1.0'?>
      <coherence>
        <cluster-config>








          <unicast-listener>
            <well-known-addresses>
              <socket-address id="1">
                <address>
                  192.168.56.91
               
      </address>
                <port>9300</port>
              </socket-address>
              <socket-address id="2">
                <address>
                  192.168.56.92
               
      </address>
                <port>9300</port>
              </socket-address>
            </well-known-addresses>
            <address>
              192.168.56.92
           
      </address>
            <port>9200</port>
          </unicast-listener>
        </cluster-config>
      </coherence>

      <?xml version='1.0'?>
      <coherence>
        <cluster-config>
          <member-identity>
            <cluster-name>
              oep_cluster
            </cluster-name>
            <member-name>
              Grid1
            </member-name>
          </member-identity>
          <unicast-listener>
            <well-known-addresses>
              <socket-address id="1">
                <address>
                  192.168.56.91
               
      </address>
                <port>9300</port>
              </socket-address>
              <socket-address id="2">
                <address>
                  192.168.56.92
               
      </address>
                <port>9300</port>
              </socket-address>
            </well-known-addresses>
            <address>
              192.168.56.91
           
      </address>
            <port>9300</port>
          </unicast-listener>
        </cluster-config>
      </coherence>

      <?xml version='1.0'?>
      <coherence>
        <cluster-config>
          <member-identity>
            <cluster-name>
              oep_cluster
            </cluster-name>
            <member-name>
              Grid2
            </member-name>
          </member-identity>
          <unicast-listener>
            <well-known-addresses>
              <socket-address id="1">
                <address>
                  192.168.56.91
               
      </address>
                <port>9300</port>
              </socket-address>
              <socket-address id="2">
                <address>
                  192.168.56.92
               
      </address>
                <port>9300</port>
              </socket-address>
            </well-known-addresses>
            <address>
              192.168.56.92
           
      </address>
            <port>9300</port>
          </unicast-listener>
        </cluster-config>
      </coherence>

    • Note that the OEP servers do not listen on the WKA addresses, using different port numbers even though they run on the same servers as the cache servers.
    • Also not that the Coherence servers are the ones that listen on the WKA addresses.
  • Now that the configuration is complete we can create a start script for the Coherence grid servers as follows:
    • #!/bin/sh
      MW_HOME=/home/oracle/fmw
      OEP_HOME=${MW_HOME}/ocep_11.1
      JAVA_HOME=${MW_HOME}/jrockit_160_33
      CACHE_SERVER_HOME=${MW_HOME}/user_projects/domains/oep_coherence
      CACHE_SERVER_CLASSPATH=${CACHE_SERVER_HOME}/HADemoCoherence.jar:${CACHE_SERVER_HOME}/config
      COHERENCE_JAR=${OEP_HOME}/modules/com.tangosol.coherence_3.7.1.6.jar
      JAVAEXEC=$JAVA_HOME/bin/java
      # specify the JVM heap size
      MEMORY=512m
      if [[ $1 == '-jmx' ]]; then
          JMXPROPERTIES="-Dcom.sun.management.jmxremote -Dtangosol.coherence.management=all -Dtangosol.coherence.management.remote=true"
          shift
      fi
      JAVA_OPTS="-Xms$MEMORY -Xmx$MEMORY $JMXPROPERTIES"
      $JAVAEXEC -server -showversion $JAVA_OPTS -cp "${CACHE_SERVER_CLASSPATH}:${COHERENCE_JAR}" com.tangosol.net.DefaultCacheServer $1
    • Note that I put the tangosol-coherence-override and the coherence-cache-config.xml files in a config directory and added that directory to my path (CACHE_SERVER_CLASSPATH=${CACHE_SERVER_HOME}/HADemoCoherence.jar:${CACHE_SERVER_HOME}/config) so that Coherence would find the override file.
    • Because my application uses in-cache processing (entry processors) I had to add a jar file containing the required classes for the entry processor to the classpath (CACHE_SERVER_CLASSPATH=${CACHE_SERVER_HOME}/HADemoCoherence.jar:${CACHE_SERVER_HOME}/config).
    • The classpath references the Coherence Jar shipped with OEP to avoid versoin mismatches (COHERENCE_JAR=${OEP_HOME}/modules/com.tangosol.coherence_3.7.1.6.jar).
    • This script is based on the standard cache-server.sh script that ships with standalone Coherence.
    • The –jmx flag can be passed to the script to enable Coherence JMX management beans.

We have now configured Coherence to use an external data grid for its application caches.  When starting we should always start at least one of the grid servers before starting the OEP servers.  This will allow the OEP server to find the grid.  If we do start things in the wrong order then the OEP servers will block waiting for a storage enabled node to start (one of the WKA servers if using Unicast).

Summary

We have now created an OEP cluster that makes use of an external Coherence grid for application caches.  The application has been modified to ensure that the timestamps of arriving events are synchronized and the output events are only output by one of the servers in the cluster.  In event of failure we may get some duplicate events with our configuration (there are configurations that avoid duplicate events) but we will not lose any events.  The final version of the application with full HA capability is shown below:

Files

The following files are available for download:

  • Oracle Event Processing
    • Includes Coherence
  • None-HA version of application
    • Includes test file TestData.csv and Load Test property file HADemoTest.prop
    • Includes Server.properties.Antony file to customize to point to your WLS installation
  • HA version of application
    • Includes test file TestData.csv and Load Test property file HADemoTest.prop
    • Includes Server.properties.Antony file to customize to point to your WLS installation
  • OEP Cluster Files
    • Includes config.xml
    • Includes tangosol-coherence-override.xml
    • Includes Server.properties that will need customizing for your WLS environment
  • Coherence Cluster Files
    • Includes tangosol-coherence-override.xml and coherence-cache-configuration.xml
    • includes cache-server.sh start script
    • Includes HADemoCoherence.jar with required classes for entry processor
References

The following references may be helpful:

Pages