skip to main content
research-article

GenProgJS: A Baseline System for Test-Based Automated Repair of JavaScript Programs

Published: 21 November 2024 Publication History

Abstract

Originally, GenProg was created to repair buggy programs written in the C programming language, launching a new discipline in Generate-and-Validate approach of Automated Program Repair (APR). Since then, a number of other tools has been published using a variety of repair approaches. Some of these still operate on programs written in C/C++, others on Java or even Python programs. In this work, a tool named GenProgJS is presented, which generates candidate patches for faulty JavaScript programs. The algorithm it uses is very similar to the genetic algorithm used in the original GenProg, hence the name. In addition to the traditional approach, solutions used in some more recent works were also incorporated, and JavaScript language-specific approaches were also taken into account when the tool was designed. To the best of our knowledge, the tool presented here is the first to apply GenProg's general generate-and-validate approach to JavaScript programs. We evaluate the method on the BugsJS bug database, where it successfully fixed 31 bugs in 6 open source Node.js projects. These bugs belong to 14 different categories showing the generic nature of the method. During the experiments, code transformations applied on the original source code are all traced, and an in-depth analysis of mutation operators and fine-grained changes are also presented. We share our findings with the APR research community and describe the difficulties and differences we faced while designed this JavaScript repair tool. The source code of GenProgJS is publicly available on Github, with a pre-configured Docker environment where it can easily be launched.

References

[1]
W. Weimer, T. Nguyen, C. Le Goues, and S. Forrest, “Automatically finding patches using genetic programming,” in Proc. 31st Int. Conf. Softw. Eng., (ICSE), Los Alamitos, CA, USA: IEEE Comput. Soc. Press, 2009, pp. 364–374.
[2]
M. Martinez and M. Monperrus, “Astor: Exploring the design space of generate-and-validate program repair beyond GenProg,” J. Syst. Softw., vol. 151, pp. 65–80, Feb. 2019.
[3]
M. Tufano, C. Watson, G. Bavota, M. Di Penta, M. White, and D. Poshyvanyk, “Deep learning similarities from different representations of source code,” in Proc. 15th Int. Conf. Mining Softw. Repositories (MSR), New York, NY, USA: ACM, 2018, pp. 542–553.
[4]
S. Mahajan, A. Alameer, P. McMinn, and W. G. J. Halfond, “Automated repair of internationalization presentation failures in web pages using style similarity clustering and search-based techniques,” in Proc. 11th IEEE Int. Conf. Softw. Testing, Verification Validation (ICST), Västerås, Sweden. Los Alamitos, CA, USA: IEEE Comput. Soc. Press, 2018, pp. 215–226.
[5]
M. Martinez, T. Durieux, R. Sommerard, J. Xuan, and M. Monperrus, “Automatic repair of real bugs in Java: A large-scale experiment on the Defects4J dataset,” Empirical Softw. Eng., vol. 22, no. 4, pp. 1936–1964, Aug. 2017.
[6]
R. Gupta, S. Pal, A. Kanade, and S. Shevade, “DeepFix: Fixing common C language errors by deep learning,” in Proc. 31st AAAI Conf. Artif. Intell., (AAAI), San Francisco, CA, USA: AAAI Press, 2017, pp. 1345–1351.
[7]
J. Xuan et al., “Nopol: Automatic repair of conditional statement bugs in Java programs,” IEEE Trans. Softw. Eng., vol. 43, no. 1, pp. 34–55, Jan. 2017.
[8]
Z. Qi, F. Long, S. Achour, and M. Rinard, “An analysis of patch plausibility and correctness for generate-and-validate patch generation systems,” in Proc. Int. Symp. Softw. Testing Anal., (ISSTA), New York, NY, USA: ACM, 2015, pp. 24–36.
[9]
C. L. Goues, M. Pradel, and A. Roychoudhury, “Automated program repair,” Commun. ACM, vol. 62, no. 12, pp. 56–65, Nov. 2019.
[10]
“Stack overflow developer survey results 2023,” 2024. Accessed: Jun. 01, 2024. [Online]. Available: https://insights.stackoverflow.com/survey/2023
[11]
“The 2023 state of the octoverse,” 2024. Accessed: Jun. 01, 2024. [Online]. Available: https://octoverse.github.com
[12]
S. H. Jensen, P. A. Jonsson, and A. Møller, “Remedying the eval that men do,” in Proc. Int. Symp. Softw. Testing Anal., (ISSTA), New York, NY, USA: ACM, 2012, pp. 34–44.
[13]
C. Le Goues, T. Nguyen, S. Forrest, and W. Weimer, “Genprog: A generic method for automatic software repair,” IEEE Trans. Softw. Eng., vol. 38, no. 1, pp. 54–72, Jan. 2012.
[14]
P. Gyimesi et al., “BugsJS: A benchmark of JavaScript bugs,” in Proc. IEEE 12th Int. Conf. Softw. Testing, Verification Validation (ICST), Apr. 2019, pp. 90–101.
[15]
A. Feldthaus, M. Schafer, M. Sridharan, J. Dolby, and F. Tip, “Efficient construction of approximate call graphs for JavaScript IDE services,” in Proc. Int. Conf. Softw. Eng., 2013, pp. 752–761.
[16]
F. S. Ocariza Jr., K. Pattabiraman, and B. Zorn, “JavaScript errors in the wild: An empirical study,” in Proc. IEEE 22nd Int. Symp. Softw. Rel. Eng. (ISSRE), Los Alamitos, CA, USA: IEEE Comput. Soc. Press, 2011, pp. 100–109.
[17]
M. Pradel, P. Schuh, and K. Sen, “TypeDevil: Dynamic type inconsistency analysis for JavaScript,” in Proc. 37th IEEE/ACM Int. Conf. Softw. Eng. (ICSE), Florence, Italy. Los Alamitos, CA, USA: IEEE Comput. Soc. Press, 2015, pp. 314–324.
[18]
G. Richards, S. Lebresne, B. Burg, and J. Vitek, “An analysis of the dynamic behavior of JavaScript programs,” in Proc. ACM SIGPLAN Conf. Program. Lang. Des. Implementation (PLDI), New York, NY, USA: ACM, 2010, pp. 1–12.
[19]
F. Ocariza, K. Bajaj, K. Pattabiraman, and A. Mesbah, “An empirical study of client-side JavaScript bugs,” in Proc. Int. Symp. Empirical Softw. Eng. Meas., 2013, pp. 55–64.
[20]
M. Monperrus, “The living review on automated program repair,” Tech. Rep., Dec. 2020. [Online]. Available: https://hal.science/hal-01956501/file/repair-living-review.pdf
[21]
M. Motwani, M. Soto, Y. Brun, R. Just, and C. Le Goues, “Quality of automated program repair on real-world defects,” IEEE Trans. Softw. Eng., vol. 48, no. 2, pp. 637–661, Feb. 2022.
[22]
M. Kechagia, S. Mechtaev, F. Sarro, and M. Harman, “Evaluating automatic program repair capabilities to repair API misuses,” IEEE Trans. Softw. Eng., vol. 48, no. 7, pp. 2658–2679, Jul. 2022.
[23]
R. K. Saha, Y. Lyu, H. Yoshida, and M. R. Prasad, “ELIXIR: Effective object-oriented program repair,” in Proc. Proc. 32nd IEEE/ACM Int. Conf. Automated Softw. Eng., Urbana-Champaign, IL, USA: Institute of Electrical and Electronics Engineers Inc., Nov. 2017, pp. 648–659.
[24]
Q.-C. Bui, R. Paramitha, D.-L. Vu, F. Massacci, and R. Scandariato, “APR4Vul: An empirical study of automatic program repair techniques on real-world Java vulnerabilities,” Empirical Softw. Eng., vol. 29, pp. 1573–7616, Dec. 2023.
[25]
D. Yang, Y. Lei, X. Mao, Y. Qi, and X. Yi, “Seeing the whole elephant: Systematically understanding and uncovering evaluation biases in automated program repair,” ACM Trans. Softw. Eng. Methodol., vol. 32, pp. 1–37, Sep. 2022.
[26]
K. Liu et al., “A critical review on the evaluation of automated program repair systems,” J. Syst. Softw., vol. 171, Jan. 2021, Art. no.
[27]
C. Le Goues, M. Dewey-Vogt, S. Forrest, and W. Weimer, “A systematic study of automated program repair: Fixing 55 out of 105 bugs for $8 each,” in Proc. Int. Conf. Softw. Eng., Piscataway, NJ, USA: IEEE Press, Jun. 2012, pp. 3–13.
[28]
M. L. Gazzola Luca and M. Daniela, “Automatic software repair: A survey,” IEEE Trans. Softw. Eng., vol. 45, no. 1, pp. 34–67, Jan. 2019.
[29]
M. Monperrus, “Automatic software repair: A bibliography,” ACM Comput. Surv., vol. 51, no. 1, pp. 1–24, Jan. 2018.
[30]
R.-M. Karampatsis and C. Sutton, “How often do single-statement bugs occur? The ManySStuBs4J dataset,” in Proc. 17th Int. Conf. Mining Softw. Repositories (MSR), New York, NY, USA: ACM, 2020, pp. 573–577.
[31]
“Esprima official website,” 2024. Accessed: Jun. 01, 2024. [Online]. Available: https://esprima.org
[32]
M. Martinez and M. Monperrus, “ASTOR: A program repair library for Java (Demo),” in Proc. 25th Int. Symp. Softw. Testing Anal., New York, NY, USA: ACM, Jul. 2016, pp. 441–444.
[33]
K. Pan, S. Kim, and E. J. Whitehead, “Toward an understanding of bug fix patterns,” Empirical Softw. Eng., vol. 14, no. 3, pp. 286–315, Jun. 2009.
[34]
Q. Hanam, F. S. d. M. Brito, and A. Mesbah, “Discovering bug patterns in JavaScript,” Proc. 24th ACM SIGSOFT Int. Symp. Found. Softw. Eng. (FSE), 2016, pp. 144–156.
[35]
J. A. Prenner and R. Robbes, “RunBugRun - An executable dataset for automated program repair,” 2023,. [Online]. Available: https://api.semanticscholar.org/CorpusID:257913527
[36]
N. Saavedra, A. Silva, and M. Monperrus, “Gitbug-actions: Building reproducible bug-fix benchmarks with GitHub actions,” in Proc. IEEE/ACM 46th Int. Conf. Softw. Eng.: Companion Proc. (ICSE-Companion), 2024, pp. 1–5.
[37]
T. Lutellier, H. V. Pham, L. Pang, Y. Li, M. Wei, and L. Tan, “CoCoNuT: Combining context-aware neural translation models using ensemble for program repair,” in Proc. 29th ACM SIGSOFT Int. Symp. Softw. Testing Anal., vol. 20, 2020, pp. 101–114.
[38]
Q. Hanam, F. S. d. M. Brito, and A. Mesbah, “Discovering bug patterns in JavaScript,” in Proc. 24th ACM SIGSOFT Int. Symp. Found. Softw. Eng., (FSE), New York, NY, USA: ACM, 2016, pp. 144–156.
[39]
Z. Feng et al., “CodeBERT: A pre-trained model for programming and natural languages,” 2020,.
[40]
V. Csuvik and L. Vidács, “FixJS: A dataset of bug-fixing JavaScript commits,” in Proc. IEEE/ACM 19th Int. Conf. Mining Softw. Repositories (MSR), 2022, pp. 712–716.
[41]
D. Horváth and L. Vidács, “Yet another miner utility unveiling a dataset: Codegrain,” in Proc. Int. Conf. Data Technol. Appl., 2024, pp. 338–345. [Online]. Available: https://api.semanticscholar.org/CorpusID:271190890
[42]
M. Lajkó, V. Csuvik, and L. Vidács, “Towards JavaScript program repair with generative pre-trained transformer (GPT-2),” in Proc. IEEE/ACM Int. Workshop Automated Program Repair (APR), 2022, pp. 61–68.
[43]
M. Lajkó, D. Horváth, V. Csuvik, and L. Vidács, “Fine-tuning GPT-2 to patch programs, is it worth it?” in Proc. Comput. Sci. Appl. (ICCSA)Workshops, O. Gervasi, B. Murgante, S. Misra, A. M. A. C. Rocha, and C. Garau, Eds., Cham: Springer International Publishing, 2022, pp. 79–91.
[44]
C. Le Goues, M. Dewey-Vogt, S. Forrest, and W. Weimer, “A systematic study of automated program repair: Fixing 55 out of 105 bugs for $8 each,” in Proc. Int. Conf. Softw. Eng., Piscataway, NJ, USA: IEEE Press, Jun. 2012, pp. 3–13.
[45]
T. Durieux, F. Madeiral, M. Martinez, and R. Abreu, “Empirical review of Java program repair tools: A large-scale experiment on 2,141 bugs and 23,551 repair attempts,” in Proc. 27th ACM Joint Meeting Eur. Softw. Eng. Conf. Symp. Found. Softw. Eng., (ESEC/FSE), New York, NY, USA: ACM, 2019, pp. 302–313.
[46]
Z. Qi, F. Long, S. Achour, and M. Rinard, “An analysis of patch plausibility and correctness for generate-and-validate patch generation systems,” in Proc. Int. Symp. Softw. Testing Anal. (ISSTA), New York, NY, USA: ACM Press, 2015, pp. 24–36.
[47]
V. Debroy and W. E. Wong, “Using mutation to automatically suggest fixes for faulty programs,” in Proc. 3rd Int. Conf. Softw. Testing, Verification Validation (ICST), 2010, pp. 65–74.
[48]
M. Martinez and M. Monperrus, “ASTOR: A program repair library for Java (Demo),” in Proc. 25th Int. Symp. Softw. Testing Anal. (ISSTA), 2016, pp. 441–444.
[49]
Y. Yuan and W. Banzhaf, “ARJA: Automated repair of Java programs via multi-objective genetic programming,” IEEE Trans. Softw. Eng., vol. 46, no. 10, pp. 1040–1067, 2020.
[50]
M. Martinez and M. Monperrus, “Ultra-large repair search space with automatically mined templates: The cardumen mode of Astor,” Lecture Notes in Comput. Sci. (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics), vol. 11036, pp. 65–86, Dec. 2018.
[51]
J. Jiang, Y. Xiong, H. Zhang, Q. Gao, and X. Chen, “Shaping program repair space with existing patches and similar code,” in Proc. 27th ACM SIGSOFT Int. Symp. Softw. Testing Anal. (ISSTA), vol. 18, 2018, pp. 298–309.
[52]
X. B. D. Le, D. Lo, and C. L. Goues, “History driven program repair,” in Proc. IEEE 23rd Int. Conf. Softw. Anal., Evol., Reengineering (SANER), Piscataway, NJ, USA: IEEE Press, Mar. 2016, pp. 213–224.
[53]
Y. Xiong et al., “Precise condition synthesis for program repair,” in Proc. 39th Int. Conf. Softw. Eng., (ICSE), Piscataway, NJ, USA: IEEE Press, 2017, pp. 416–426.
[54]
Q. Xin and S. P. Reiss, “Leveraging syntax-related code for automated program repair,” in Proc. 32nd IEEE/ACM Int. Conf. Automated Softw. Eng., 2017, pp. 660–670.
[55]
L. Chen, Y. Pei, and C. A. Furia, “Contract-based program repair without the contracts,” Tech. Rep., 2017. [Online]. Available: https://ieeexplore.ieee.org/document/8115674
[56]
J. Hua, M. Zhang, K. Wang, and S. Khurshid, “Towards practical program repair with on-demand candidate generation,” in Proc. 40th Int. Conf. Softw. Eng., New York, NY, USA: ACM, May 2018, pp. 12–23.
[57]
A. Koyuncu et al., “FixMiner: Mining relevant fix patterns for automated program repair,” Empirical Softw. Eng., vol. 25, no. 3, pp. 1980–2024, May 2020.
[58]
F. Long and M. Rinard, “Automatic patch generation by learning correct code,” in Proc. 43rd Annu. ACM SIGPLAN-SIGACT Symp. Princ. Program. Lang. (POPL), 2016, pp. 298–312.
[59]
R. Just, D. Jalali, and M. D. Ernst, “Defects4J: A database of existing faults to enable controlled testing studies for Java programs,” in Proc. Int. Symp. Softw. Testing Anal. (ISSTA), New York, NY, USA: ACM, Jul. 2014, pp. 437–440.
[60]
B. Khaireddine, M. Martinez, and A. Mili, “Program repair at arbitrary fault depth,” in Proc. 12th IEEE Conf. Softw. Testing, Validation Verification (ICST), Piscataway, NJ, USA: IEEE Press, Apr. 2019, pp. 465–472.
[61]
V. Csuvik, D. Horvath, F. Horvath, and L. Vidacs, “Utilizing source code embeddings to identify correct patches,” in Proc. IEEE 2nd Int. Workshop Intell. Bug Fixing (IBF), Piscataway, NJ, USA: IEEE Press, 2020, pp. 18–25.
[62]
E. K. Smith, E. T. Barr, C. Le Goues, and Y. Brun, “Is the cure worse than the disease? Overfitting in automated program repair,” in Proc. 10th Joint Meeting Found. Softw. Eng. (ESEC/FSE), New York, NY, USA: ACM, 2015, pp. 532–543.
[63]
A. M. Fard and A. Mesbah, “JavaScript: The (un)covered parts,” in Proc. IEEE Int. Conf. Softw. Testing, Verification Validation (ICST), Piscataway, NJ, USA: IEEE Press, 2017, pp. 230–240.
[64]
D. Kim, J. Nam, J. Song, and S. Kim, “Automatic patch generation learned from human-written patches,” in Proc. - Int. Conf. Softw. Eng., Piscataway, NJ, USA: IEEE Press, May 2013, pp. 802–811.
[65]
A. Fonseca and M. Oliveira, “Figra: Evaluating a larger search space for cardumen in automatic program repair,” in Proc. IEEE/ACM Int. Workshop Automated Program Repair (APR), 2022, pp. 24–30.
[66]
M. Monperrus, “A critical review of “automatic patch generation learned from human-written patches”: Essay on the problem statement and the evaluation of automatic software repair,” in Proc. 36th Int. Conf. Softw. Eng. (ICSE), New York, NY, USA: ACM Press, 2014, pp. 234–242.
[67]
D. Rodríguez-Baquero and M. Linares-Vásquez, “Mutode: Generic JavaScript and node.js mutation testing tool,” in Proc. 27th ACM SIGSOFT Int. Symp. Softw. Testing Anal., New York, NY, USA: ACM, Jul. 2018, pp. 372–375.
[68]
M. Selakovic and M. Pradel, “Poster: Automatically fixing real-world JavaScript performance bugs,” in Proc. IEEE/ACM 37th IEEE Int. Conf. Softw. Eng., vol. 2, 2015, pp. 811–812.
[69]
C. Hanna, A. Blot, and J. Petke, “Reinforcement learning for mutation operator selection in automated program repair,” 2023.
[70]
F. S. Ocariza, Jr., K. Pattabiraman, and A. Mesbah, “Vejovis: Suggesting fixes for JavaScript faults,” in Proc. 36th Int. Conf. Softw. Eng. (ICSE), New York, NY, USA: ACM, 2014, pp. 837–847.
[71]
T. Durieux, Y. Hamadi, and M. Monperrus, “Fully automated html and javascript rewriting for constructing a self-healing web proxy,” in Proc. IEEE 29th Int. Symp. Softw. Rel. Eng. (ISSRE), 2018, pp. 1–12.
[72]
S. Bae, H. Cho, I. Lim, and S. Ryu, SAFEWAPI: Web API Misuse Detector for Web Applications. New York, NY, USA: ACM, 2014.
[73]
S. Mechtaev, J. Yi, and A. Roychoudhury, “DirectFix: Looking for simple program repairs,” in Proc. IEEE/ACM 37th IEEE Int. Conf. Softw. Eng., Piscataway, NJ, USA: IEEE Press, May 2015, pp. 448–458.
[74]
M. White, M. Tufano, M. Martinez, M. Monperrus, and D. Poshyvanyk, “Sorting and transforming program repair ingredients via deep learning code similarities,” in Proc. 26th IEEE Int. Conf. Softw. Anal., Evolution Reengineering (SANER), Hangzhou, China, X. Wang, D. Lo, and E. Shihab, Eds., Piscataway, NJ, USA: IEEE Press, 2019, pp. 479–490.
[75]
M. Tufano, J. Pantiuchina, C. Watson, G. Bavota, and D. Poshyvanyk, “On learning meaningful code changes via neural machine translation,” in Proc. 41st Int. Conf. Softw. Eng., (ICSE), Piscataway, NJ, USA: IEEE Press, 2019, pp. 25–36.
[76]
A. Ghanbari, “Revisiting object similarity-based patch ranking in automated program repair: An extensive study,” in Proc. IEEE/ACM Int. Workshop Automated Program Repair (APR), 2022, pp. 16–23.
[77]
S. Wang, M. Wen, L. Chen, X. Yi, and X. Mao, “How different is it between machine-generated and developer-provided patches?: An empirical study on the correct patches generated by automated program repair techniques,” in Proc. Int. Symp. Empirical Softw. Eng. Meas., vol. 2019, Porto de Galinhas, Brazil: IEEE Comput. Soc. Press, Sep. 2019.
[78]
S. Mechtaev, J. Yi, and A. Roychoudhury, “Angelix: Scalable multiline program patch synthesis via symbolic analysis,” in Proc. IEEE/ACM 38th Int. Conf. Softw. Eng. (ICSE), 2016, pp. 691–701.
[79]
F. Y. Assiri and J. M. Bieman, “Fault localization for automated program repair: Effectiveness, performance, repair correctness,” Softw. Qual. J., vol. 25, no. 1, pp. 171–199, Mar. 2017.
[80]
L. Gazzola, D. Micucci, and L. Mariani, “Automatic software repair: A survey,” IEEE Trans. Softw. Eng., vol. 45, no. 1, pp. 34–67, Jan. 2019.
[81]
P. Hooimeijer and W. Weimer, “Modeling bug report quality,” in Proc. 22nd IEEE/ACM Int. Conf. Automated Softw. Eng., (ASE), New York, NY, USA: ACM, 2007, pp. 34–43.
[82]
J. Yang, A. Zhikhartsev, Y. Liu, and L. Tan, “Better test cases for better automated program repair,” in Proc. 11th Joint Meeting Found. Softw. Eng. (ESEC/FSE), 2017, pp. 831–841.
[83]
Z. Chen, S. J. Kommrusch, M. Tufano, L. N. Pouchet, D. Poshyvanyk, and M. Monperrus, “SEQUENCER: Sequence-to-sequence learning for end-to-end program repair,” IEEE Trans. Softw. Eng., vol. 47, no. 9, pp. 1943–1959, Sep. 2021.
[84]
E. Dinella, H. Dai, G. Brain, Z. Li, M. Naik, L. Song, G. Tech, and K. Wang, “Hoppity: Learning graph transformations to detect and fix bugs in programs,” Tech. Rep., 2020. [Online]. Available: https://openreview.net/forum?id=SJeqs6EFvB
[85]
L. Yi, S. Wang, and T. N. Nguyen, “Dlfix: Context-based code transformation learning for automated program repair,” in Proc. - Int. Conf. Softw. Eng.. IEEE Computer Society, jun 2020, pp. 602–614.
[86]
N. Jiang, T. Lutellier, and L. Tan, “CURE: Code-aware neural machine translation for automatic. program repair,” May 2021, pp. 1161–1173.
[87]
A. Mastropaolo et al., “Studying the usage of text-to-text transfer transformer to support code-related tasks,” in Proc. IEEE/ACM 43rd Int. Conf. Softw. Eng. (ICSE), 2021, pp. 336–347.
[88]
P. Thongtanunam, C. Pornprasit, and C. Tantithamthavorn, “Autotransform: Automated code transformation to support modern code review process,” in Proc. IEEE/ACM 44th Int. Conf. Softw. Eng. (ICSE), 2022, pp. 237–248.
[89]
S. Kim, J. Zhao, Y. Tian, and S. Chandra, “Code prediction by feeding trees to transformers,” in Proc. IEEE/ACM 43rd Int. Conf. Softw. Eng. (ICSE), 2021, pp. 150–162.
[90]
M. Namavar, N. Nashid, and A. Mesbah, “A controlled experiment of different code representations for learning-based bug repair,” Oct. 2021,.

Comments

Information & Contributors

Information

Published In

IEEE Transactions on Software Engineering  Volume 51, Issue 2
Feb. 2025
338 pages

Publisher

IEEE Press

Publication History

Published: 21 November 2024

Qualifiers

  • Research-article

Contributors

Other Metrics

Bibliometrics & Citations

Bibliometrics

Article Metrics

  • 0
    Total Citations
  • 0
    Total Downloads
  • Downloads (Last 12 months)0
  • Downloads (Last 6 weeks)0
Reflects downloads up to 27 Feb 2025

Other Metrics

Citations

View Options

View options

Figures

Tables

Media

Share

Share

Share this Publication link

Share on social media

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy