Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[size-opt] Optimize DefaultStorageKeyAllocator code size #20926

Merged
merged 1 commit into from
Jul 19, 2022

Conversation

Damian-Nordic
Copy link
Contributor

@Damian-Nordic Damian-Nordic commented Jul 19, 2022

Problem

It turns out that calling DefaultStorageKeyAllocator::Format() for each key costs non-negligible amount of flash while it's not really needed for constant keys.

Change overview

Change DefaultStorageKeyAllocator so that using constant keys can be easily optimized by compilers.
That small optimization saves almost 1kB of flash on some ARM examples.
Changed static methods of the class to non-static to unify the way the class is used.

Testing

Unit tests + tested commissioning and control after the device reboot.

It turns out that calling Format() for each key costs
non-negligible amount of flash while it's not really needed
for constant keys.

Signed-off-by: Damian Krolik <damian.krolik@nordicsemi.no>
@github-actions
Copy link

github-actions bot commented Jul 19, 2022

PR #20926: Size comparison from fcd6594 to 1a6ca18

Increases above 0.2%:

platform target config section fcd6594 1a6ca18 change % change
cc13x2_26x2 all-clusters-app LP_CC2652R7 (read/write) 182640 183400 760 0.4
lock-ftd LP_CC2652R7 (read/write) 169604 170372 768 0.5
lock-mtd LP_CC2652R7 (read/write) 183008 183784 776 0.4
pump-app LP_CC2652R7 (read/write) 161468 162244 776 0.5
pump-controller-app LP_CC2652R7 (read/write) 175796 176548 752 0.4
shell LP_CC2652R7 (read/write) 185644 186412 768 0.4
Increases (43 builds for bl602, cc13x2_26x2, cyw30739, efr32, esp32, k32w, linux, mbed, nrfconnect, p6, telink)
platform target config section fcd6594 1a6ca18 change % change
bl602 lighting-app bl602 .bss 116962 116970 8 0.0
bl602+rpc .bss 124410 124418 8 0.0
cc13x2_26x2 all-clusters-app LP_CC2652R7 (read/write) 182640 183400 760 0.4
.bss 74132 74140 8 0.0
all-clusters-minimal-app LP_CC2652R7 (read/write) 157700 157708 8 0.0
.bss 73428 73436 8 0.0
lock-ftd LP_CC2652R7 (read/write) 169604 170372 768 0.5
.bss 71196 71204 8 0.0
lock-mtd LP_CC2652R7 (read/write) 183008 183784 776 0.4
.bss 66884 66892 8 0.0
pump-app LP_CC2652R7 (read/write) 161468 162244 776 0.5
.bss 71276 71284 8 0.0
pump-controller-app LP_CC2652R7 (read/write) 175796 176548 752 0.4
.bss 71396 71404 8 0.0
shell LP_CC2652R7 (read/write) 185644 186412 768 0.4
.bss 76436 76444 8 0.0
cyw30739 light cyw930739m2evb_01 .bss 64232 64240 8 0.0
lock cyw930739m2evb_01 .bss 68960 68968 8 0.0
ota-requestor-no-progress-logging cyw930739m2evb_01 .bss 63440 63448 8 0.0
efr32 lighting-app BRD4161A (read/write) 1084792 1085616 824 0.1
.bss 133044 133052 8 0.0
.text 949680 950496 816 0.1
BRD4161A+rpc (read/write) 1139084 1139900 816 0.1
.bss 149724 149732 8 0.0
.text 987076 987884 808 0.1
BRD4161A+rs911x (read/write) 950160 950824 664 0.1
.bss 140768 140776 8 0.0
.text 807324 807980 656 0.1
lock-app BRD4161A+wf200 .bss 144136 144144 8 0.0
window-app BRD4161A (read/write) 1078284 1079108 824 0.1
.bss 134516 134524 8 0.0
.text 941672 942488 816 0.1
esp32 all-clusters-app c3devkit (read/write) 1486026 1486042 16 0.0
.dram0.bss 70080 70088 8 0.0
m5stack (read/write) 488064 488072 8 0.0
.dram0.bss 75600 75608 8 0.0
k32w light k32w061+release .bss 69540 69548 8 0.0
lock k32w061+release .bss 70004 70012 8 0.0
linux all-clusters-app debug (read only) 2975641 2976313 672 0.0
.text 2532930 2533602 672 0.0
all-clusters-minimal-app debug (read only) 2822201 2822873 672 0.0
.text 2381218 2381890 672 0.0
bridge-app debug+rpc (read only) 2322489 2323161 672 0.0
.text 1962226 1962898 672 0.0
chip-tool debug (read only) 10297761 10298257 496 0.0
.text 8333684 8334180 496 0.0
chip-tool-ipv6only arm64 (read only) 10038380 10038428 48 0.0
.text 7978196 7978244 48 0.0
lighting-app debug+rpc (read only) 2560265 2560937 672 0.0
.text 2175922 2176594 672 0.0
lock-app debug (read only) 2525097 2525769 672 0.0
.text 2130578 2131250 672 0.0
ota-provider-app debug (read only) 2328673 2329345 672 0.0
.text 1961778 1962450 672 0.0
ota-requestor-app debug (read only) 2446281 2447865 1584 0.1
.text 2067234 2068818 1584 0.1
shell debug (read only) 2562545 2563169 624 0.0
.text 2177042 2177666 624 0.0
thermostat-no-ble arm64 (read only) 2603116 2603180 64 0.0
.text 2197072 2197136 64 0.0
tv-app debug (read only) 3110585 3111273 688 0.0
.text 2672898 2673586 688 0.0
tv-casting-app debug (read only) 5358625 5359297 672 0.0
.text 4760098 4760770 672 0.0
mbed lock-app CY8CPROTO_062_4343W+release .bss 213940 213948 8 0.0
nrfconnect all-clusters-app nrf52840dk_nrf52840 bss 142900 142908 8 0.0
all-clusters-minimal-app nrf52840dk_nrf52840 bss 142136 142144 8 0.0
p6 all-clusters-app default (read/write) 1685036 1685148 112 0.0
.bss 148560 148568 8 0.0
.text 1525440 1525544 104 0.0
all-clusters-minimal-app default (read/write) 1629180 1629292 112 0.0
.bss 147840 147848 8 0.0
.text 1470304 1470408 104 0.0
light-app default (read/write) 1549220 1549332 112 0.0
.bss 139744 139752 8 0.0
.text 1398648 1398752 104 0.0
lock-app default (read/write) 1576220 1576332 112 0.0
.bss 139600 139608 8 0.0
.text 1425776 1425880 104 0.0
telink light-switch-app tlsr9518adk80d bss 70576 70584 8 0.0
lighting-app tlsr9518adk80d bss 71420 71428 8 0.0
Decreases (26 builds for bl602, cc13x2_26x2, cyw30739, efr32, esp32, k32w, mbed, nrfconnect, p6, telink)
platform target config section fcd6594 1a6ca18 change % change
bl602 lighting-app bl602 (read/write) 1379762 1379298 -464 -0.0
.text 1050416 1049936 -480 -0.0
bl602+rpc (read/write) 1425170 1424706 -464 -0.0
.text 1082072 1081592 -480 -0.0
cc13x2_26x2 all-clusters-app LP_CC2652R7 (read only) 668599 667847 -752 -0.1
.text 579964 579212 -752 -0.1
all-clusters-minimal-app LP_CC2652R7 (read only) 634223 633447 -776 -0.1
.text 556348 555572 -776 -0.1
lock-ftd LP_CC2652R7 (read only) 671811 671051 -760 -0.1
.rodata 76451 76443 -8 -0.0
.text 594880 594128 -752 -0.1
lock-mtd LP_CC2652R7 (read only) 654095 653327 -768 -0.1
.rodata 101199 101191 -8 -0.0
.text 552416 551656 -760 -0.1
pump-app LP_CC2652R7 (read only) 680795 680027 -768 -0.1
.text 591500 590732 -768 -0.1
pump-controller-app LP_CC2652R7 (read only) 666587 665843 -744 -0.1
.text 581432 580688 -744 -0.1
shell LP_CC2652R7 (read only) 661098 660338 -760 -0.1
.rodata 85098 85090 -8 -0.0
.text 575684 574932 -752 -0.1
cyw30739 light cyw930739m2evb_01 (read/write) 582142 581366 -776 -0.1
.app_xip_area 460704 459920 -784 -0.2
lock cyw930739m2evb_01 (read/write) 588058 587274 -784 -0.1
.app_xip_area 461892 461100 -792 -0.2
ota-requestor-no-progress-logging cyw930739m2evb_01 (read/write) 585474 584722 -752 -0.1
.app_xip_area 464884 464124 -760 -0.2
efr32 lock-app BRD4161A+wf200 (read/write) 1128004 1127212 -792 -0.1
.text 981792 980992 -800 -0.1
esp32 all-clusters-app c3devkit (read only) 1021762 1021328 -434 -0.0
.flash.text 1021762 1021328 -434 -0.0
m5stack (read only) 1075507 1075139 -368 -0.0
.flash.text 1070123 1069755 -368 -0.0
k32w light k32w061+release (read/write) 660924 660176 -748 -0.1
.text 583592 582836 -756 -0.1
lock k32w061+release (read/write) 687908 687148 -760 -0.1
.text 610100 609332 -768 -0.1
mbed lock-app CY8CPROTO_062_4343W+release (read/write) 2449128 2448416 -712 -0.0
.text 1411772 1411060 -712 -0.1
nrfconnect all-clusters-app nrf52840dk_nrf52840 (read/write) 1176643 1175843 -800 -0.1
text 812636 811828 -808 -0.1
all-clusters-minimal-app nrf52840dk_nrf52840 (read/write) 1156675 1155907 -768 -0.1
text 801920 801140 -780 -0.1
p6 all-clusters-app default (read only) 882136 882128 -8 -0.0
all-clusters-minimal-app default (read only) 882856 882848 -8 -0.0
light-app default (read only) 891160 891152 -8 -0.0
lock-app default (read only) 891288 891280 -8 -0.0
telink light-switch-app tlsr9518adk80d (read/write) 798700 798212 -488 -0.1
text 566814 566350 -464 -0.1
lighting-app tlsr9518adk80d (read/write) 818732 818260 -472 -0.1
text 583344 582894 -450 -0.1
Full report (43 builds for bl602, cc13x2_26x2, cyw30739, efr32, esp32, k32w, linux, mbed, nrfconnect, p6, telink)
platform target config section fcd6594 1a6ca18 change % change
bl602 lighting-app bl602 (read/write) 1379762 1379298 -464 -0.0
.bss 116962 116970 8 0.0
.data 4480 4480 0 0.0
.text 1050416 1049936 -480 -0.0
bl602+rpc (read/write) 1425170 1424706 -464 -0.0
.bss 124410 124418 8 0.0
.data 4600 4600 0 0.0
.text 1082072 1081592 -480 -0.0
cc13x2_26x2 all-clusters-app LP_CC2652R7 (read only) 668599 667847 -752 -0.1
(read/write) 182640 183400 760 0.4
.bss 74132 74140 8 0.0
.data 3356 3356 0 0.0
.rodata 88319 88319 0 0.0
.text 579964 579212 -752 -0.1
all-clusters-minimal-app LP_CC2652R7 (read only) 634223 633447 -776 -0.1
(read/write) 157700 157708 8 0.0
.bss 73428 73436 8 0.0
.data 3356 3356 0 0.0
.rodata 77551 77551 0 0.0
.text 556348 555572 -776 -0.1
lock-ftd LP_CC2652R7 (read only) 671811 671051 -760 -0.1
(read/write) 169604 170372 768 0.5
.bss 71196 71204 8 0.0
.data 3280 3280 0 0.0
.rodata 76451 76443 -8 -0.0
.text 594880 594128 -752 -0.1
lock-mtd LP_CC2652R7 (read only) 654095 653327 -768 -0.1
(read/write) 183008 183784 776 0.4
.bss 66884 66892 8 0.0
.data 3280 3280 0 0.0
.rodata 101199 101191 -8 -0.0
.text 552416 551656 -760 -0.1
pump-app LP_CC2652R7 (read only) 680795 680027 -768 -0.1
(read/write) 161468 162244 776 0.5
.bss 71276 71284 8 0.0
.data 3280 3280 0 0.0
.rodata 88811 88811 0 0.0
.text 591500 590732 -768 -0.1
pump-controller-app LP_CC2652R7 (read only) 666587 665843 -744 -0.1
(read/write) 175796 176548 752 0.4
.bss 71396 71404 8 0.0
.data 3276 3276 0 0.0
.rodata 84675 84675 0 0.0
.text 581432 580688 -744 -0.1
shell LP_CC2652R7 (read only) 661098 660338 -760 -0.1
(read/write) 185644 186412 768 0.4
.bss 76436 76444 8 0.0
.data 3360 3360 0 0.0
.rodata 85098 85090 -8 -0.0
.text 575684 574932 -752 -0.1
cyw30739 light cyw930739m2evb_01 (read/write) 582142 581366 -776 -0.1
.app_xip_area 460704 459920 -784 -0.2
.bss 64232 64240 8 0.0
.data 716 716 0 0.0
.rodata 0 0 0 0.0
.text 112 112 0 0.0
lock cyw930739m2evb_01 (read/write) 588058 587274 -784 -0.1
.app_xip_area 461892 461100 -792 -0.2
.bss 68960 68968 8 0.0
.data 720 720 0 0.0
.rodata 0 0 0 0.0
.text 112 112 0 0.0
ota-requestor-no-progress-logging cyw930739m2evb_01 (read/write) 585474 584722 -752 -0.1
.app_xip_area 464884 464124 -760 -0.2
.bss 63440 63448 8 0.0
.data 660 660 0 0.0
.rodata 0 0 0 0.0
.text 112 112 0 0.0
efr32 lighting-app BRD4161A (read/write) 1084792 1085616 824 0.1
.bss 133044 133052 8 0.0
.data 2048 2048 0 0.0
.text 949680 950496 816 0.1
BRD4161A+rpc (read/write) 1139084 1139900 816 0.1
.bss 149724 149732 8 0.0
.data 2260 2260 0 0.0
.text 987076 987884 808 0.1
BRD4161A+rs911x (read/write) 950160 950824 664 0.1
.bss 140768 140776 8 0.0
.data 2048 2048 0 0.0
.text 807324 807980 656 0.1
lock-app BRD4161A+wf200 (read/write) 1128004 1127212 -792 -0.1
.bss 144136 144144 8 0.0
.data 2056 2056 0 0.0
.text 981792 980992 -800 -0.1
window-app BRD4161A (read/write) 1078284 1079108 824 0.1
.bss 134516 134524 8 0.0
.data 2076 2076 0 0.0
.text 941672 942488 816 0.1
esp32 all-clusters-app c3devkit (read only) 1021762 1021328 -434 -0.0
(read/write) 1486026 1486042 16 0.0
.dram0.bss 70080 70088 8 0.0
.dram0.data 14600 14600 0 0.0
.flash.rodata 215912 215912 0 0.0
.flash.text 1021762 1021328 -434 -0.0
.iram0.text 62902 62902 0 0.0
m5stack (read only) 1075507 1075139 -368 -0.0
(read/write) 488064 488072 8 0.0
.dram0.bss 75600 75608 8 0.0
.dram0.data 34144 34144 0 0.0
.flash.rodata 246324 246324 0 0.0
.flash.text 1070123 1069755 -368 -0.0
.iram0.text 123267 123267 0 0.0
k32w light k32w061+release (read/write) 660924 660176 -748 -0.1
.bss 69540 69548 8 0.0
.data 1992 1992 0 0.0
.text 583592 582836 -756 -0.1
lock k32w061+release (read/write) 687908 687148 -760 -0.1
.bss 70004 70012 8 0.0
.data 2004 2004 0 0.0
.text 610100 609332 -768 -0.1
linux all-clusters-app debug (read only) 2975641 2976313 672 0.0
(read/write) 155152 155152 0 0.0
.bss 61696 61696 0 0.0
.data 2048 2048 0 0.0
.data.rel.ro 85160 85160 0 0.0
.dynamic 608 608 0 0.0
.got 4568 4568 0 0.0
.init 27 27 0 0.0
.init_array 1064 1064 0 0.0
.rodata 264733 264733 0 0.0
.text 2532930 2533602 672 0.0
all-clusters-minimal-app debug (read only) 2822201 2822873 672 0.0
(read/write) 146824 146824 0 0.0
.bss 60896 60896 0 0.0
.data 2048 2048 0 0.0
.data.rel.ro 77720 77720 0 0.0
.dynamic 608 608 0 0.0
.got 4488 4488 0 0.0
.init 27 27 0 0.0
.init_array 1056 1056 0 0.0
.rodata 265661 265661 0 0.0
.text 2381218 2381890 672 0.0
bridge-app debug+rpc (read only) 2322489 2323161 672 0.0
(read/write) 125640 125640 0 0.0
.bss 48960 48960 0 0.0
.data 3824 3824 0 0.0
.data.rel.ro 67096 67096 0 0.0
.dynamic 608 608 0 0.0
.got 4392 4392 0 0.0
.init 27 27 0 0.0
.init_array 736 736 0 0.0
.rodata 198240 198240 0 0.0
.text 1962226 1962898 672 0.0
chip-tool debug (read only) 10297761 10298257 496 0.0
(read/write) 629640 629640 0 0.0
.bss 24760 24760 0 0.0
.data 3234 3234 0 0.0
.data.rel.ro 595256 595256 0 0.0
.dynamic 608 608 0 0.0
.got 5088 5088 0 0.0
.init 27 27 0 0.0
.init_array 648 648 0 0.0
.rodata 515765 515765 0 0.0
.text 8333684 8334180 496 0.0
chip-tool-ipv6only arm64 (read only) 10038380 10038428 48 0.0
(read/write) 694801 694801 0 0.0
.bss 42993 42993 0 0.0
.data 3304 3304 0 0.0
.data.rel.ro 630920 630920 0 0.0
.dynamic 528 528 0 0.0
.got 13656 13656 0 0.0
.init 24 24 0 0.0
.init_array 192 192 0 0.0
.rodata 479820 479820 0 0.0
.text 7978196 7978244 48 0.0
lighting-app debug+rpc (read only) 2560265 2560937 672 0.0
(read/write) 129664 129664 0 0.0
.bss 49472 49472 0 0.0
.data 2096 2096 0 0.0
.data.rel.ro 72248 72248 0 0.0
.dynamic 608 608 0 0.0
.got 4392 4392 0 0.0
.init 27 27 0 0.0
.init_array 824 824 0 0.0
.rodata 214088 214088 0 0.0
.text 2175922 2176594 672 0.0
lock-app debug (read only) 2525097 2525769 672 0.0
(read/write) 124648 124648 0 0.0
.bss 47872 47872 0 0.0
.data 1712 1712 0 0.0
.data.rel.ro 69208 69208 0 0.0
.dynamic 608 608 0 0.0
.got 4424 4424 0 0.0
.init 27 27 0 0.0
.init_array 800 800 0 0.0
.rodata 229064 229064 0 0.0
.text 2130578 2131250 672 0.0
ota-provider-app debug (read only) 2328673 2329345 672 0.0
(read/write) 118448 118448 0 0.0
.bss 47520 47520 0 0.0
.data 1944 1944 0 0.0
.data.rel.ro 63192 63192 0 0.0
.dynamic 608 608 0 0.0
.got 4488 4488 0 0.0
.init 27 27 0 0.0
.init_array 680 680 0 0.0
.rodata 203832 203832 0 0.0
.text 1961778 1962450 672 0.0
ota-requestor-app debug (read only) 2446281 2447865 1584 0.1
(read/write) 125384 125384 0 0.0
.bss 49888 49888 0 0.0
.data 2232 2232 0 0.0
.data.rel.ro 67416 67416 0 0.0
.dynamic 608 608 0 0.0
.got 4480 4480 0 0.0
.init 27 27 0 0.0
.init_array 736 736 0 0.0
.rodata 207584 207584 0 0.0
.text 2067234 2068818 1584 0.1
shell debug (read only) 2562545 2563169 624 0.0
(read/write) 141240 141240 0 0.0
.bss 57480 57480 0 0.0
.data 1264 1264 0 0.0
.data.rel.ro 76792 76792 0 0.0
.dynamic 608 608 0 0.0
.got 4136 4136 0 0.0
.init 27 27 0 0.0
.init_array 936 936 0 0.0
.rodata 228114 228114 0 0.0
.text 2177042 2177666 624 0.0
thermostat-no-ble arm64 (read only) 2603116 2603180 64 0.0
(read/write) 158481 158481 0 0.0
.bss 65281 65281 0 0.0
.data 1704 1704 0 0.0
.data.rel.ro 83368 83368 0 0.0
.dynamic 528 528 0 0.0
.got 5104 5104 0 0.0
.init 24 24 0 0.0
.init_array 400 400 0 0.0
.rodata 165748 165748 0 0.0
.text 2197072 2197136 64 0.0
tv-app debug (read only) 3110585 3111273 688 0.0
(read/write) 257840 257840 0 0.0
.bss 167048 167048 0 0.0
.data 4848 4848 0 0.0
.data.rel.ro 79496 79496 0 0.0
.dynamic 608 608 0 0.0
.got 4848 4848 0 0.0
.init 27 27 0 0.0
.init_array 960 960 0 0.0
.rodata 249504 249504 0 0.0
.text 2672898 2673586 688 0.0
tv-casting-app debug (read only) 5358625 5359297 672 0.0
(read/write) 157800 157800 0 0.0
.bss 51048 51048 0 0.0
.data 2416 2416 0 0.0
.data.rel.ro 98032 98032 0 0.0
.dynamic 608 608 0 0.0
.got 4736 4736 0 0.0
.init 27 27 0 0.0
.init_array 920 920 0 0.0
.rodata 332841 332841 0 0.0
.text 4760098 4760770 672 0.0
mbed lock-app CY8CPROTO_062_4343W+release (read only) 6224 6224 0 0.0
(read/write) 2449128 2448416 -712 -0.0
.bss 213940 213948 8 0.0
.data 5872 5872 0 0.0
.text 1411772 1411060 -712 -0.1
nrfconnect all-clusters-app nrf52840dk_nrf52840 (read/write) 1176643 1175843 -800 -0.1
bss 142900 142908 8 0.0
rodata 142204 142204 0 0.0
text 812636 811828 -808 -0.1
all-clusters-minimal-app nrf52840dk_nrf52840 (read/write) 1156675 1155907 -768 -0.1
bss 142136 142144 8 0.0
rodata 133748 133748 0 0.0
text 801920 801140 -780 -0.1
p6 all-clusters-app default (read only) 882136 882128 -8 -0.0
(read/write) 1685036 1685148 112 0.0
.bss 148560 148568 8 0.0
.data 2648 2648 0 0.0
.text 1525440 1525544 104 0.0
all-clusters-minimal-app default (read only) 882856 882848 -8 -0.0
(read/write) 1629180 1629292 112 0.0
.bss 147840 147848 8 0.0
.data 2648 2648 0 0.0
.text 1470304 1470408 104 0.0
light-app default (read only) 891160 891152 -8 -0.0
(read/write) 1549220 1549332 112 0.0
.bss 139744 139752 8 0.0
.data 2440 2440 0 0.0
.text 1398648 1398752 104 0.0
lock-app default (read only) 891288 891280 -8 -0.0
(read/write) 1576220 1576332 112 0.0
.bss 139600 139608 8 0.0
.data 2456 2456 0 0.0
.text 1425776 1425880 104 0.0
telink light-switch-app tlsr9518adk80d (read/write) 798700 798212 -488 -0.1
bss 70576 70584 8 0.0
noinit 40416 40416 0 0.0
text 566814 566350 -464 -0.1
lighting-app tlsr9518adk80d (read/write) 818732 818260 -472 -0.1
bss 71420 71428 8 0.0
noinit 40416 40416 0 0.0
text 583344 582894 -450 -0.1

@woody-apple woody-apple merged commit 21c457a into project-chip:master Jul 19, 2022
github-actions bot pushed a commit that referenced this pull request Jul 19, 2022
It turns out that calling Format() for each key costs
non-negligible amount of flash while it's not really needed
for constant keys.

Signed-off-by: Damian Krolik <damian.krolik@nordicsemi.no>
woody-apple added a commit that referenced this pull request Jul 19, 2022
…0941)

It turns out that calling Format() for each key costs
non-negligible amount of flash while it's not really needed
for constant keys.

Signed-off-by: Damian Krolik <damian.krolik@nordicsemi.no>

Co-authored-by: Damian Królik <66667989+Damian-Nordic@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants